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

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <tuple>
#include <vector>

using namespace std;
#define int long long
#define rep(i, n) for (int i = 0; i < n; ++i)
#define rep1(i, n) for (int i = 1; i <= n; ++i)
#define ALL(x) x.begin(), x.end()
#define ll long long
#define lint long long
typedef pair<int, int> P;
const lint inf = 1e18 + 7;
const int MOD = 1000000007;
class Edge {
public:
  // int s;
  int t;
  long long len;
};
class Node {
public:
  int num;           // node番号
  long long dist;    // startからの距離
  vector<Edge> edge; // 自分から生えている辺
  bool comp;         // dijkstra中で到達しているかどうか
  int nxt;
  void in_edge(int in_t, int in_len) {
    Edge in;
    in.t = in_t;
    in.len = in_len;
    edge.push_back(in);
    nxt = 0;
  }
};
bool operator>(const Node &a, const Node &r) { return a.dist > r.dist; }
void dijkstra(vector<Node> &node, int s, int n) {
  // n個のノードでできたグラフのsからtまでの最短距離を計算する
  // この時各要素のdistの値はsからの最短距離となる
  for (int i = 1; i <= n; i++) {
    // 初期化
    node[i].dist = inf;
    node[i].num = i;
    node[i].comp = true;
    node[i].nxt = 0;
  }
  node[s].dist = 0;
  priority_queue<Node, vector<Node>, greater<Node>> que;
  que.push(node[s]);
  while (!que.empty()) {
    Node buf;
    buf = que.top(); //
    que.pop();
    int k = buf.num;
    if (node[k].comp) {
      node[k].comp = false;
      int edge_num = buf.edge.size();
      for (int i = 0; i < edge_num; i++) {
        int buf_t = node[k].edge[i].t;
        int buf_len = node[k].edge[i].len;
        if (node[buf_t].dist > node[k].dist + buf_len) {
          node[buf_t].dist = node[k].dist + buf_len;
          que.push(node[buf_t]);
        }
      }
    }
  }
}
signed main() {
  int n, m;
  cin >> n >> m;
  vector<Node> node(n + 1);
  rep(i, m) {
    int a, b;
    cin >> a >> b;
    node[a].in_edge(b, 1);
    node[b].in_edge(a, 1);
  }
  dijkstra(node, 1, n);
  queue<Node> que;
  que.push(node[1]);
  while (!que.empty()) {
    Node buf = que.front();
    que.pop();
    int num = buf.edge.size();
    rep(i, num) {
      int buf_t = buf.edge[i].t;
      if (node[buf_t].dist == buf.dist + 1 && node[buf_t].nxt == 0) {
        node[buf_t].nxt = buf.num;
        que.push(node[buf_t]);
      }
    }
  }
  cout << "Yes"
       << "\\n";
  for (int i = 2; i <= n; ++i) {
    cout << node[i].nxt << "\\n";
  }
  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <iostream>
#include <map>
#include <queue>
#include <string>
#include <tuple>
#include <vector>

using namespace std;
#define int long long
#define rep(i, n) for (int i = 0; i < n; ++i)
#define rep1(i, n) for (int i = 1; i <= n; ++i)
#define ALL(x) x.begin(), x.end()
#define ll long long
#define lint long long
typedef pair<int, int> P;
const lint inf = 1e18 + 7;
const int MOD = 1000000007;
class Edge {
public:
  // int s;
  int t;
  long long len;
};
class Node {
public:
  int num;           // node番号
  long long dist;    // startからの距離
  vector<Edge> edge; // 自分から生えている辺
  bool comp;         // dijkstra中で到達しているかどうか
  int nxt;
  void in_edge(int in_t, int in_len) {
    Edge in;
    in.t = in_t;
    in.len = in_len;
    edge.push_back(in);
    nxt = 0;
  }
};
bool operator>(const Node &a, const Node &r) { return a.dist > r.dist; }
void dijkstra(vector<Node> &node, int s, int n) {
  // n個のノードでできたグラフのsからtまでの最短距離を計算する
  // この時各要素のdistの値はsからの最短距離となる
  for (int i = 1; i <= n; i++) {
    // 初期化
    node[i].dist = inf;
    node[i].num = i;
    node[i].comp = true;
  }
  node[s].dist = 0;
  priority_queue<Node, vector<Node>, greater<Node>> que;
  que.push(node[s]);
  while (!que.empty()) {
    Node buf;
    buf = que.top(); //
    que.pop();
    int k = buf.num;
    if (node[k].comp) {
      node[k].comp = false;
      int edge_num = buf.edge.size();
      for (int i = 0; i < edge_num; i++) {
        int buf_t = node[k].edge[i].t;
        int buf_len = node[k].edge[i].len;
        if (node[buf_t].dist > node[k].dist + buf_len) {
          node[buf_t].dist = node[k].dist + buf_len;
          que.push(node[buf_t]);
        }
      }
    }
  }
}
signed main() {
  int n, m;
  cin >> n >> m;
  vector<Node> node(n + 1);
  rep(i, m) {
    int a, b;
    cin >> a >> b;
    node[a].in_edge(b, 1);
    node[b].in_edge(a, 1);
  }
  dijkstra(node, 1, n);
  queue<Node> que;
  que.push(node[1]);
  while (!que.empty()) {
    Node buf = que.front();
    que.pop();
    int num = buf.edge.size();
    rep(i, num) {
      int buf_t = buf.edge[i].t;
      if (node[buf_t].dist == buf.dist + 1) {
        node[buf_t].nxt = buf.num;
        que.push(node[buf_t]);
      }
    }
  }
  cout << "Yes"
       << "\\n";
  for (int i = 2; i <= n; ++i) {
    cout << node[i].nxt << "\\n";
  }
  return 0;
}