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

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (n); ++i)

queue<int> q;
std::vector<int> ch;

std::vector<int> ans;
std::vector<std::vector<int>> ab;

int main() {
  int n, m;
  std::cin >> n >> m;
  ab.assign(n, std::vector<int>());
  ch.assign(n, -1);
  ans.assign(n, -1);

  rep(i, m) {
    int a, b;
    std::cin >> a >> b;
    a--;
    b--;
    ab[a].push_back(b);
    ab[b].push_back(a);
  }

  q.push(0);
  ch.assign(n, -1);
  ch[0] = 0;

  // 0から広さ優先探索
  while (!q.empty()) {
    int v = q.front();
    q.pop();
    for (int nv : ab[v]) {
      if (ch[nv] != -1)
        continue;
      ch[nv] = ch[v] + 1;
      q.push(nv);
    }
  }

  for (int i = 1; i < n; i++) {
    int cost = ch[i];
    for (int v : ab[i]) {
      if (ch[v] + 1 == cost) {
        ans[i] = v;
        break;
      }
    }
  }

  for (int i = 1; i < n; i++) {
    if (ans[i] == -1) {
      std::cout << "-1" << '\\n';
      return 0;
    }
  }

  std::cout << "Yes" << '\\n';
  for (int i = 1; i < n; i++) {
    std::cout << ans[i] + 1 << '\\n';
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (n); ++i)

queue<int> q;
std::vector<int> ch;

std::vector<int> ans;
std::vector<std::vector<int>> ab;

// bool bfs(){
//
//   while (!q.empty()) {
//     int next=q.front();q.pop();
//     ch[next]=1;
//
//     std::cout << " 現在位置" <<next+1<<'\\n';
//     for (int r : ab[next]) {
//       std::cout <<"  :"<<next+1<<" : " <<r+1<<'\\n';
//       //目的地
//       if(r==0){
//         ans[next]=r;
//         return true;
//       }
//
//
//       if(ch[r]==-1){
//         q.push(r);
//         ch[r]=1;
//         if(bfs()==true){
//           if(ans[next]==-1)ans[next]=r;
//           if(ans[next]!=r) return false;
//           return true;
//         }
//       }
//
//     }
//   }
//   return false;
//
// }

int main() {
  int n, m;
  std::cin >> n >> m;
  ab.assign(n, std::vector<int>());
  ch.assign(n, -1);
  ans.assign(n, -1);

  rep(i, m) {
    int a, b;
    std::cin >> a >> b;
    a--;
    b--;
    ab[a].push_back(b);
    ab[b].push_back(a);
  }

  for (int i = 1; i < n; i++) {
    q.push(i);
    ch.assign(n, -1);
    ch[i] = 0;

    // std::cout << "開始" <<i<<'\\n';
    while (!q.empty()) {
      int v = q.front();
      q.pop();
      for (int nv : ab[v]) {
        // std::cout <<" :"<< n<<":"<<nv << '\\n';
        if (ch[nv] != -1)
          continue;
        ch[nv] = ch[v] + 1;
        q.push(nv);
      }
    }

    if (ch[0] == -1) {
      // std::cout << "no" << '\\n';
      std::cout << -1 << '\\n';
      return 0;
    }
    // std::cout << i <<"番目終了"<<'\\n';
    // rep(j,n){std::cout << ch[j] << ' ';}
    // std::cout << "" << '\\n';

    int cost = ch[0] - 1;

    stack<int> q2;
    q2.push(0);
    bool flag = false;

    while (!q2.empty()) {
      // std::cout <<"cost:"<<cost<<"の辺を探す" << '\\n';
      int v = q2.top();
      q2.pop();
      for (int nv : ab[v]) {
        // if(ch[nv]!=cost)continue;
        // if(ans[nv]!=-1)continue;
        // std::cout << " :"<<nv <<" : "<<ch[nv]<<'\\n';

        if (ch[nv] == cost) {
          ans[nv] = v;
          q2.push(nv);
          flag = true;
        }
      }
      if (flag)
        cost--;
      else
        cost++;
      flag = false;
      if (cost < 0)
        break;
    }

    // std::cout << "逆順" << '\\n';
    // rep(j,n){std::cout << ans[j] << ' ';}
    // std::cout << "" << '\\n';
  }

  std::cout << "Yes" << '\\n';
  for (int i = 1; i < n; i++) {
    std::cout << ans[i] + 1 << '\\n';
  }

  return 0;
}