Problem p02726 (C++) — buggy submission, verdict: Time Limit Exceeded

// グラフ

#include <algorithm>
#include <array>
#include <bitset>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
#define int long long
using P = pair<int, int>;
constexpr int INF = 1000000000 + 8;

class Graph {
private:
  struct edge {
    int to;
    int cost;
    edge(int i, int c = 1) : to(i), cost(c) {}
  };
  vector<vector<edge>> edges;
  vector<int> dists;

public:
  Graph(int n) { edges.resize(n); };
  int size() const { return edges.size(); };
  int countEdge() const {
    int count = 0;
    for (auto &&i : edges)
      for (auto &&j : i)
        count++;
    return count;
  }
  void addDirectedEdge(int from, int to, int cost = 1) {
    edges[from].push_back(edge(to, cost));
  }
  void addEdge(int from, int to, int cost = 1) {
    addDirectedEdge(from, to, cost);
    addDirectedEdge(to, from, cost);
  }
  // 頂点sからの最短距離更新
  void dijkstrta(int s) {
    dists.assign(size(), INF);
    priority_queue<P, vector<P>, greater<P>> pq;
    pq.push({0, s});
    dists[s] = 0;

    while (!pq.empty()) {
      // 仮の最短距離と頂点の集合のうち、最短距離が最小の頂点を「最短距離が確定した頂点」とする
      int p = pq.top().second, p_dists = pq.top().first;
      pq.pop();
      // ある経路で仮の最短距離と頂点の集合に追加されたが、別の経路で「最短距離が確定した頂点」は更新しない
      if (dists[p] < p_dists)
        continue;

      // 「最短距離が確定した頂点」と隣接した頂点の最短距離を更新する
      for (auto &&edge : edges[p]) {
        const int np = edge.to;
        const int cost = edge.cost;
        if (dists[np] > dists[p] + cost) {
          dists[np] = dists[p] + cost;
          // 仮の最短距離と頂点の集合に追加する
          pq.push({dists[np], np});
        }
      }
    }
  }
  int distance(int i) const { return dists[i]; }
  // rから辿りつけない辺を削除する
};

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);

  int n, x, y;
  cin >> n >> x >> y;

  Graph g(n);
  for (int i = 1; i < n; i++) {
    g.addEdge(i, i - 1);
  }
  g.addEdge(x - 1, y - 1);

  // counts_dist_pair[d]: 距離がdの組(i,j)の数
  vector<int> counts_dist_pair(n);

  for (int i = 0; i < n; i++) {
    g.dijkstrta(i);
    for (int j = i + 1; j < n; j++) {
      const int d = g.distance(j);
      counts_dist_pair[d]++;
    }
  }

  for (int i = 1; i < n; i++) {
    cout << counts_dist_pair[i] << endl;
  }
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
using namespace std;
#define int long long
constexpr int INF = 1000000000 + 8;

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(0);

  int n, x, y;
  cin >> n >> x >> y;

  vector<vector<int>> d(n, vector<int>(n, INF));
  for (int i = 1; i < n; i++) {
    d[i][i - 1] = 1;
    d[i - 1][i] = 1;
  }
  d[x - 1][y - 1] = 1;
  d[y - 1][x - 1] = 1;

  for (int k = 0; k < n; k++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
      }
    }
  }

  vector<int> anss(n);
  for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
      if (d[i][j] > 0 && d[i][j] < n) {
        anss[d[i][j]]++;
      }
    }
  }

  for (int i = 1; i < n; i++) {
    cout << anss[i] << endl;
  }
}