Problem p03142 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>

using namespace ::std;

// vector<int> find_reachable_child(int parent, vector<int> kodomo,
// vector<vector<int> > &reachable)
// {
// for(int i(0); i < kodomo[parent].size(); ++i)
// {
// int child = kodomo[parent][i];
// reachable[parent][child] = 1;
// find_reachable_child(child, kodomo, reachable);
// }
// return kodomo;
// }

// bool is_reachable(int child, int parent, vector<vector <int> > oya, int
// depth)
// {
//     if(child == parent)
//     {
//         if(depth > 2)
//             return true;
//     }
//     if(oya[child].size() == 0)
//         return false;

//     for(int i(0); i < oya[child].size(); ++i)
//     {
//         int dep = depth;
//         if(is_reachable(oya[child][i], parent, oya, ++dep))
//             return true;
//     }
//     return false;
// }

int main() {
  int n, m;
  cin >> n >> m;

  vector<int> a;
  vector<int> b;

  vector<vector<int>> oya(n + 1, vector<int>(0));
  vector<vector<int>> kodomo(n + 1, vector<int>(0));
  vector<int> motomoto(n + 1);

  for (int i(0); i < n + m - 1; ++i) {
    int ai, bi;
    cin >> ai >> bi;
    a.push_back(ai);
    b.push_back(bi);
    kodomo[ai].push_back(bi);
    oya[bi].push_back(ai);
  }

  int root;
  for (int i(1); i < n + 1; ++i) {
    if (oya[i].size() == 0) {
      motomoto[i] == 0;
      root = i;
      break;
    }
  }

  queue<int> q;
  q.push(root);

  while (!q.empty()) {
    int node = q.front();
    q.pop();

    for (int i(0); i < kodomo[node].size(); ++i) {
      int child = kodomo[node][i];
      motomoto[child] = node;
      q.push(child);
    }
  }

  for (int i(1); i < n + 1; ++i) {
    cout << motomoto[i] << endl;
  }

  // cout << cnt << endl;
  return 0;
}

Fixed submission:
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <string>
#include <vector>

using namespace ::std;

// vector<int> find_reachable_child(int parent, vector<int> kodomo,
// vector<vector<int> > &reachable)
// {
// for(int i(0); i < kodomo[parent].size(); ++i)
// {
// int child = kodomo[parent][i];
// reachable[parent][child] = 1;
// find_reachable_child(child, kodomo, reachable);
// }
// return kodomo;
// }

// bool is_reachable(int child, int parent, vector<vector <int> > oya, int
// depth)
// {
//     if(child == parent)
//     {
//         if(depth > 2)
//             return true;
//     }
//     if(oya[child].size() == 0)
//         return false;

//     for(int i(0); i < oya[child].size(); ++i)
//     {
//         int dep = depth;
//         if(is_reachable(oya[child][i], parent, oya, ++dep))
//             return true;
//     }
//     return false;
// }

int main() {
  int n, m;
  cin >> n >> m;

  vector<int> a;
  vector<int> b;

  vector<vector<int>> oya(n + 1, vector<int>(0));
  vector<vector<int>> kodomo(n + 1, vector<int>(0));
  vector<int> motomoto(n + 1);

  for (int i(0); i < n + m - 1; ++i) {
    int ai, bi;
    cin >> ai >> bi;
    a.push_back(ai);
    b.push_back(bi);
    kodomo[ai].push_back(bi);
    oya[bi].push_back(ai);
  }

  int root;
  for (int i(1); i < n + 1; ++i) {
    if (oya[i].size() == 0) {
      motomoto[i] == 0;
      root = i;
      break;
    }
  }

  queue<int> q;
  q.push(root);

  while (!q.empty()) {
    int node = q.front();
    q.pop();

    for (int i(0); i < kodomo[node].size(); ++i) {
      int child = kodomo[node][i];
      oya[child].erase(oya[child].end() - 1);
      if (oya[child].size() == 0) {
        motomoto[child] = node;
        q.push(child);
      }
    }
  }

  for (int i(1); i < n + 1; ++i) {
    cout << motomoto[i] << endl;
  }

  // cout << cnt << endl;
  return 0;
}