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

#include <algorithm>
#include <array>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <new>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <vector>

// #include "All.h"

using namespace std;

#define EPS (1e-9)
#define INF (1e9)
#define MOD (ll)(1e9 + 7)
#define PI (acos(-1))
#define REP(i, a, n) for (int i = a; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define allof(a) (a).begin(), (a).end()

#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" ; "IMPOSSIBLE")

using ll = long long int;

ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

ll beki(ll a, ll b) {
  ll tmp = 1;
  rep(i, b) tmp *= a;
  return tmp;
}

int N, M;
vector<int> v[100010];
int depth[100010];
int ans[100010] = {};

// void dfs(int);
void bfs();

int main() {

  cin >> N >> M;
  rep(i, M) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
    // 双方向にvectorでグラフを表現
  }
  // depth[1] = 1;
  // dfs(1);
  bfs();

  /*
  REP(i, 2, N + 1) {
      //cout << depth[i] << endl;
      if (depth[i] == INF) {
          cout << "No" << endl;
          return 0;
      }
  }
  */

  cout << "Yes" << endl;
  REP(i, 2, N + 1) { cout << ans[i] << endl; }
}

void bfs() {
  queue<int> q;
  // 全てをINFで初期化
  rep(i, 100010) depth[i] = INF;
  q.push(1);
  depth[1] = 0;

  // キューが空になるまでループ
  while (q.size()) {
    // キューの先頭を取り出す
    int a = q.front();
    q.pop();
    // 移動先をループ
    rep(i, (int)v[a].size()) {
      // 移動した後の部屋をbとする
      int b = v[a][i];
      if (depth[b] > depth[a] + 1) {
        q.push(b);
        depth[b] = depth[a] + 1;
        ans[b] = a;
      }
    }
  }
}

/*
void dfs(int a) {
    //aは前回のインデックス
    //dは前回の深さ
    //まずv[a]のやつを全部出してdfsする
    //もしdepthが一緒かこっちのほうがおおきかったらあきらめる
    rep(i, (int)v[a].size()) {
        //v[a][i]は向こう側のインデックス
        int b = v[a][i];
        if (b == a) continue;
        //cout << "a:" << a << " b:" <<  b << " ";
        if (depth[b] > depth[a] + 1) {
            depth[b] = depth[a] + 1;
            //cout << "depth[" << b << "]:" << depth[b] << endl;
            ans[b] = a;
            dfs(b);
        }
    }
}
*/

Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <new>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <tuple>
#include <vector>

// #include "All.h"

using namespace std;

#define EPS (1e-9)
#define INF (1e9)
#define MOD (ll)(1e9 + 7)
#define PI (acos(-1))
#define REP(i, a, n) for (int i = a; i < n; i++)
#define rep(i, n) REP(i, 0, n)
#define allof(a) (a).begin(), (a).end()

#define Yes(q) ((q) ? "Yes" : "No")
#define YES(q) ((q) ? "YES" : "NO")
#define Possible(q) ((q) ? "Possible" : "Impossible")
#define POSSIBLE(q) ((q) ? "POSSIBLE" ; "IMPOSSIBLE")

using ll = long long int;

ll gcd(ll a, ll b) {
  if (a < b)
    swap(a, b);
  if (b == 0)
    return a;
  return gcd(b, a % b);
}

ll beki(ll a, ll b) {
  ll tmp = 1;
  rep(i, b) tmp *= a;
  return tmp;
}

int N, M;
vector<int> v[200010];
int depth[200010];
int ans[200010] = {};

// void dfs(int);
void bfs();

int main() {

  cin >> N >> M;
  rep(i, M) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
    // 双方向にvectorでグラフを表現
  }
  depth[1] = 1;
  // dfs(1);
  bfs();

  /*
  REP(i, 2, N + 1) {
      //cout << depth[i] << endl;
      if (depth[i] == INF) {
          cout << "No" << endl;
          return 0;
      }
  }
  */

  cout << "Yes" << endl;
  REP(i, 2, N + 1) { cout << ans[i] << endl; }
}

void bfs() {
  queue<int> q;
  // 全てをINFで初期化
  rep(i, 200010) depth[i] = INF;
  q.push(1);
  depth[1] = 0;

  // キューが空になるまでループ
  while (q.size()) {
    // キューの先頭を取り出す
    int a = q.front();
    q.pop();
    // 移動先をループ
    rep(i, (int)v[a].size()) {
      // 移動した後の部屋をbとする
      int b = v[a][i];
      if (depth[b] > depth[a]) {
        q.push(b);
        depth[b] = depth[a] + 1;
        ans[b] = a;
      }
    }
  }
}

void dfs(int a) {
  // aは前回のインデックス
  // dは前回の深さ
  // まずv[a]のやつを全部出してdfsする
  // もしdepthが一緒かこっちのほうがおおきかったらあきらめる
  rep(i, (int)v[a].size()) {
    // v[a][i]は向こう側のインデックス
    int b = v[a][i];
    if (b == a)
      continue;
    // cout << "a:" << a << " b:" <<  b << " ";
    if (depth[b] > depth[a] + 1) {
      depth[b] = depth[a] + 1;
      // cout << "depth[" << b << "]:" << depth[b] << endl;
      ans[b] = a;
      dfs(b);
    }
  }
}