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

#include <bits/stdc++.h>
using namespace std;

int main() {

  int n, m;
  cin >> n >> m;

  multimap<int, int> relation;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;

    //       bool flg=true;
    //       auto p = relation.equal_range(a);
    //       for (auto it = p.first; it != p.second; ++it) {
    //           if(it->second==b){
    //               flg=false;
    //               break;
    //           }
    //       }
    //       if(flg){
    relation.emplace(a, b);
    relation.emplace(b, a);
    //       }
  }

  // 探索する。
  vector<int> visit(n + 1, -1);

  int max_count = 1;
  for (int i = 1; i <= n; i++) {
    int cnt_wk = 0;
    auto p = relation.count(i);
    //        cout<<"======"<<endl;
    //        cout<<endl;
    //        cout<<"i="<<i<<endl;
    //        cout<<"p="<<p<<endl;
    //        cout<<"visit="<<visit.at(i)<<endl;
    if (p != 0 && visit.at(i) == -1) { // 空では無く未訪問の場合
      //            cout<<"--"<<endl;
      queue<int> que;
      que.push(i); // iからスタート

      // BFS開始（キューが空になるまで探索を行う）
      while (!que.empty()) {
        int v = que.front();
        //                cout<<"v="<<v<<endl;
        que.pop();
        visit.at(v) = 0; // 訪問済みにする。
        cnt_wk++;
        // vからたどれるところを調べる。
        auto p = relation.equal_range(v);
        for (auto it = p.first; it != p.second; ++it) {
          if (visit[it->second] != -1)
            continue;

          visit[it->second] = 0;
          que.push(it->second);
        }
      }
      max_count = max(max_count, cnt_wk);
    }
  }

  cout << max_count << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

int main() {

  int n, m;
  cin >> n >> m;

  multimap<int, int> relation;
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;

    bool flg = true;
    auto p = relation.equal_range(a);
    for (auto it = p.first; it != p.second; ++it) {
      if (it->second == b) {
        flg = false;
        break;
      }
    }
    if (flg) {
      relation.emplace(a, b);
      relation.emplace(b, a);
    }
  }

  // 探索する。
  vector<int> visit(n + 1, -1);

  int max_count = 1;
  for (int i = 1; i <= n; i++) {
    int cnt_wk = 0;
    auto p = relation.count(i);
    //        cout<<"======"<<endl;
    //        cout<<endl;
    //        cout<<"i="<<i<<endl;
    //        cout<<"p="<<p<<endl;
    //        cout<<"visit="<<visit.at(i)<<endl;
    if (p != 0 && visit.at(i) == -1) { // 空では無く未訪問の場合
      //            cout<<"--"<<endl;
      queue<int> que;
      que.push(i); // iからスタート

      // BFS開始（キューが空になるまで探索を行う）
      while (!que.empty()) {
        int v = que.front();
        //                cout<<"v="<<v<<endl;
        que.pop();
        visit.at(v) = 0; // 訪問済みにする。
        cnt_wk++;
        // vからたどれるところを調べる。
        auto p = relation.equal_range(v);
        for (auto it = p.first; it != p.second; ++it) {
          if (visit[it->second] != -1)
            continue;

          visit[it->second] = 0;
          que.push(it->second);
        }
      }
      max_count = max(max_count, cnt_wk);
    }
  }

  cout << max_count << endl;

  return 0;
}