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

#include <iostream>
#include <list>
#include <stdio.h>
using namespace std;

class Node {
private:
public:
  Node();
  int id;
  list<int> next_node_list;
  int next_idx;
  void AddNextNode(int id);
  void SetGroup(int prev_id, int num);
  int group;
  void Init(int id);
};

Node::Node() {
  group = 0;
  next_idx = 0;
}

void Node::AddNextNode(int id) { next_node_list.push_back(id); }

Node *Node_list;

void Node::SetGroup(int prev_id, int num) {
  group = num;

  list<int>::iterator itr;
  itr = next_node_list.begin();
  for (int i = 0; i < next_idx; i++) {
    itr++;
  }

  for (; itr != next_node_list.end(); itr++) {
    next_idx++;
    if (prev_id != *itr) {
      Node_list[*itr].SetGroup(id, num);
    }
  }
}

void Node::Init(int id) { this->id = id; }

int main(void) {
  // input
  int n;
  cin >> n;
  Node_list = new Node[n]();
  for (int i = 0; i < n; i++) {
    Node_list[i].Init(i);
  }
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int s, t;
    cin >> s >> t;
    Node_list[s].AddNextNode(t);
    Node_list[t].AddNextNode(s);
  }

  // group
  int group = 1;
  for (int i = 0; i < n; i++) {
    if (Node_list[i].group)
      continue;
    Node_list[i].SetGroup(-1, group);
    group++;
  }

  // output
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int s, t;
    cin >> s >> t;
    if (Node_list[s].group == Node_list[t].group && Node_list[s].group != 0) {
      cout << "yes"
           << "\\n";
    } else {
      cout << "no"
           << "\\n";
    }
  }

  return 0;
}


Error: TLE

Fixed submission:

#include <iostream>
#include <list>
#include <queue>
#include <stdio.h>
using namespace std;

queue<int> que;

class Node {
private:
  // int next_num;
  // int *next_node_list;
  list<int> next_node_list;

public:
  Node();
  void AddNextNode(int id);
  bool Search(int st, int ed);
  bool check; //!
              // bool *check;
  // bool *link;
};

Node::Node() {
  // next_num = 0;
  check = false;
  /*check = new bool[n];
  for (int i = 0; i < n; i++) {
          check[i] = false;
  }*/
  /*link = new bool[n];
  for (int i = 0; i < n; i++) {
          link[i] = false;
  }*/
}

void Node::AddNextNode(int id) {
  next_node_list.push_back(id);
  // next_node_list[next_num] = id;
  // next_num++;
}

Node *Node_list;

bool Node::Search(int st, int ed) {
  // if (link[ed]) return true;

  /*for (int k = 0; k < next_num; k++) {
          Node_list[st].link[next_node_list[k]] = true;
          Node_list[next_node_list[k]].link[st] = true;
  }*/

  /*for (int i = 0; i < next_num; i++) {
          if (next_node_list[i] == ed) return true;
  }*/
  list<int>::iterator itr;
  for (itr = next_node_list.begin(); itr != next_node_list.end(); itr++) {
    if (*itr == ed)
      return true;
  }

  /*for (int j = 0; j < next_num; j++) {
          //if (Node_list[next_node_list[j]].check[ed] == 0) {
          if (Node_list[next_node_list[j]].check == 0) { //!
          //	Node_list[next_node_list[j]].check[ed] = 1;
                  Node_list[next_node_list[j]].check = 1; //!
                  que.push(next_node_list[j]);
          }
  }*/
  for (itr = next_node_list.begin(); itr != next_node_list.end(); itr++) {
    if (Node_list[*itr].check == 0) {
      Node_list[*itr].check = 1;
      que.push(*itr);
    }
  }

  return false;
}

int main(void) {
  // input
  int n;
  cin >> n;
  Node_list = new Node[n]();
  int m;
  cin >> m;
  for (int i = 0; i < m; i++) {
    int s, t;
    cin >> s >> t;
    Node_list[s].AddNextNode(t);
    Node_list[t].AddNextNode(s);
  }

  // output
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int s, t;
    cin >> s >> t;
    // Node_list[s].check[t] = true;
    Node_list[s].check = true; //!
    bool ret = Node_list[s].Search(s, t);
    while (!ret && !que.empty()) {
      ret = Node_list[que.front()].Search(s, t);
      que.pop();
    };

    while (!que.empty()) {
      que.pop();
    }
    for (int j = 0; j < n; j++) {
      // Node_list[j].check[t] = false;
      Node_list[j].check = false; //!
    }

    if (ret) {
      cout << "yes"
           << "\\n";
    } else {
      cout << "no"
           << "\\n";
    }
  }

  return 0;
}