Problem p02726 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
// const int mod=998244353;
const double eps = 1e-10;
const double pi = acos(-1.0);
const int maxn = 2e3 + 10;
const ll inf = 0x3f3f3f3f;
const int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

int ans[maxn];
// Dijstra
struct Edge {
  int u, v, w, next;
} e[maxn];
int head[maxn], cnt, n, m, s, vis[maxn], dis[maxn];
struct node {
  int w, now;
  inline bool operator<(const node &x) const
  // 重载运算符把最小的元素放在堆顶（大根堆）
  {
    return w > x.w; // 这里注意符号要为'>'
  }
};
priority_queue<node> q;
// 优先队列，其实这里一般使用一个pair，但为了方便理解所以用的结构体
inline void add(int u, int v, int w) {
  e[++cnt].u = u;
  // 这句话对于此题不需要，但在缩点之类的问题还是有用的
  e[cnt].v = v;
  e[cnt].w = w;
  e[cnt].next = head[u];
  // 存储该点的下一条边
  head[u] = cnt;
  // 更新目前该点的最后一条边（就是这一条边）
}
// 链式前向星加边
void dijkstra() {
  for (int i = 1; i <= n; i++) {
    dis[i] = inf;
  }
  dis[s] = 0;
  // 赋初值
  q.push((node){0, s});
  while (!q.empty())
  // 堆为空即为所有点都更新
  {
    node x = q.top();
    q.pop();
    int u = x.now;
    if (dis[u] < x.w)
      continue;
    for (int i = head[u]; i; i = e[i].next)
    // 搜索堆顶所有连边
    {
      int v = e[i].v;
      if (dis[v] > dis[u] + e[i].w) {
        dis[v] = dis[u] + e[i].w;
        // 松弛操作
        q.push((node){dis[v], v});
        // 把新遍历到的点加入堆中
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // freopen("in.txt","r",stdin);
  // freopen("out.txt","w",stdout);
  int x, y;
  cin >> n >> x >> y;
  for (int i = 1; i < n; i++) {
    add(i, i + 1, 1);
    add(i + 1, i, 1);
  }
  add(x, y, 1);
  add(y, x, 1);
  for (int i = 1; i <= n; i++) {
    s = i;
    dijkstra();
    for (int j = i + 1; j <= n; j++)
      ans[dis[j]]++;
  }
  for (int i = 1; i < n; i++)
    cout << ans[i] << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define endl '\n'
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
// const int mod=998244353;
const double eps = 1e-10;
const double pi = acos(-1.0);
const int maxn = 2e4 + 10;
const ll inf = 0x3f3f3f3f;
const int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

int ans[maxn];
// Dijstra
struct Edge {
  int u, v, w, next;
} e[maxn];
int head[maxn], cnt, n, m, s, vis[maxn], dis[maxn];
struct node {
  int w, now;
  inline bool operator<(const node &x) const
  // 重载运算符把最小的元素放在堆顶（大根堆）
  {
    return w > x.w; // 这里注意符号要为'>'
  }
};
priority_queue<node> q;
// 优先队列，其实这里一般使用一个pair，但为了方便理解所以用的结构体
inline void add(int u, int v, int w) {
  e[++cnt].u = u;
  // 这句话对于此题不需要，但在缩点之类的问题还是有用的
  e[cnt].v = v;
  e[cnt].w = w;
  e[cnt].next = head[u];
  // 存储该点的下一条边
  head[u] = cnt;
  // 更新目前该点的最后一条边（就是这一条边）
}
// 链式前向星加边
void dijkstra() {
  for (int i = 1; i <= n; i++) {
    dis[i] = inf;
  }
  dis[s] = 0;
  // 赋初值
  q.push((node){0, s});
  while (!q.empty())
  // 堆为空即为所有点都更新
  {
    node x = q.top();
    q.pop();
    int u = x.now;
    if (dis[u] < x.w)
      continue;
    for (int i = head[u]; i; i = e[i].next)
    // 搜索堆顶所有连边
    {
      int v = e[i].v;
      if (dis[v] > dis[u] + e[i].w) {
        dis[v] = dis[u] + e[i].w;
        // 松弛操作
        q.push((node){dis[v], v});
        // 把新遍历到的点加入堆中
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  // freopen("in.txt","r",stdin);
  // freopen("out.txt","w",stdout);
  int x, y;
  cin >> n >> x >> y;
  for (int i = 1; i < n; i++) {
    add(i, i + 1, 1);
    add(i + 1, i, 1);
  }
  add(x, y, 1);
  add(y, x, 1);
  for (int i = 1; i <= n; i++) {
    s = i;
    dijkstra();
    for (int j = i + 1; j <= n; j++)
      ans[dis[j]]++;
  }
  for (int i = 1; i < n; i++)
    cout << ans[i] << endl;
  return 0;
}