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

//???????????????????????¨??????????????????A????????????B????????£?????¨??????A
//-> B??¨?????????????????????
//????????¨???????????°???????????§???????????°???????????§s??????t????????????????????¨????????¨??????
//????????????????????????s -> s1 -> s2 -> ??? ->
//t??¨???????????¨?????§?????????????????¨???????????????s < s1 < s2 < ??? <
//t??¨????????? s-t??????????????????L?????£?????¨??????t????????? >= s?????????
// +
// L??§???????????¨????¢??????????????????????s??????t?????????????????????ML??¨????????°???
// t????????? >= s????????? +
// ML?????¨???????????????????????\\????????????????????????1?????\\?????§?????????????????????1????????????????§?????????????
//?????????t???????????????t????????? = s????????? + ML??¨?????????????????????
//?????±????¨????????????????????????´????????????????????±????±????????????¨?????§??????????????±????±?????????°????????????????????????
//??¨?????????????????±2????????????????????????????????????????????§???1????????????1???k????????´?????????????????????????\\?????????????
//??????????????????1?????????????????????{1, 2,
//4}?????£?????¨???????????????3?????????????????????????????£???????????????????????????
//
//????????¨????????°?????¨???????????????????????????????????????????????°???????????°?????\\??????????????????????????°??§????????????
//????????????????????¨????????¨??????????????????????????????????????°???????????????DAG????????????DAG?????§??????????????????????§£??????????°????????????§?????????????????????
//???????????????????????????????????°?????????????????????????????§????????¢???????????????????????????????????????????????¨????????????
//??¶?????????????????????,
//1?????????????????¢)??§?????????????????????????????§??????????????§???BFS??§??????
//????£?????????????????????????0???n-1????????????????????????
//
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> P;

vector<int> et[5000], rev_et[5000];
int dp[5000]; // dp[i] = ?????????i(>=0)?????????

int n, m;
queue<P> que;

void bfs() {
  while (!que.empty()) {
    int dist = que.front().first;
    int team = que.front().second;
    que.pop();
    if (dp[team] >= dist)
      continue;
    dp[team] = dist;

    for (int i = 0; i < et[team].size(); i++) {
      que.push(P(dist + 1, et[team][i]));
    }
  }
}

int main() {
  int i, j;

  cin >> n >> m;
  for (i = 0; i < m; i++) {
    int s, t;
    cin >> s >> t;
    et[s - 1].push_back(t - 1);
    rev_et[t - 1].push_back(s - 1);
  }

  for (i = 0; i < n; i++) {
    if (rev_et[i].size() == 0) { // i?????\\???????????????
      que.push(P(
          1,
          i)); //?§?????????????(dp[i]???????????????0????????§??£?????°????????????????????????)
    }
  }
  bfs(); //???????????¢?´¢??§dp??¨????????????

  static P perm[5000]; // perm[i] = (??????dp[i], ???????????????i)
  for (i = 0; i < n; i++)
    perm[i] = P(dp[i], i);
  sort(perm, perm + n); //????????§?????????

  bool flag = false;
  for (i = 0; i < n; i++) {
    cout << perm[i].second + 1 << endl;
    if (i + 1 < n && perm[i].first == perm[i + 1].first) {
      flag = true;
    }
  }
  if (flag)
    cout << 1 << endl;
  else
    cout << 0 << endl;
  return 0;
}

Error: TLE

Fixed submission:

//???????????????????????¨??????????????????A????????????B????????£?????¨??????A
//-> B??¨?????????????????????
//????????¨???????????°???????????§???????????°???????????§s??????t????????????????????¨????????¨??????
//????????????????????????s -> s1 -> s2 -> ??? ->
//t??¨???????????¨?????§?????????????????¨???????????????s < s1 < s2 < ??? <
//t??¨????????? s-t??????????????????L?????£?????¨??????t????????? >= s?????????
// +
// L??§???????????¨????¢??????????????????????s??????t?????????????????????ML??¨????????°???
// t????????? >= s????????? +
// ML?????¨???????????????????????\\????????????????????????1?????\\?????§?????????????????????1????????????????§?????????????
//?????????t???????????????t????????? = s????????? + ML??¨?????????????????????
//?????±????¨????????????????????????´????????????????????±????±????????????¨?????§??????????????±????±?????????°????????????????????????
//??¨?????????????????±2????????????????????????????????????????????§???1????????????1???k????????´?????????????????????????\\?????????????
//??????????????????1?????????????????????{1, 2,
//4}?????£?????¨???????????????3?????????????????????????????£???????????????????????????
//
//????????¨????????°?????¨???????????????????????????????????????????????°???????????°?????\\??????????????????????????°??§????????????
//????????????????????¨????????¨??????????????????????????????????????°???????????????DAG????????????DAG?????§??????????????????????§£??????????°????????????§?????????????????????
//???????????????????????????????????°?????????????????????????????§????????¢???????????????????????????????????????????????¨????????????
//??¶?????????????????????,
//1?????????????????¢)??§?????????????????????????????§??????????????§???BFS??§??????
//????£?????????????????????????0???n-1????????????????????????
//
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> P;

bool table[5000][5000] = {false};
int dp[5000]; // dp[i] = ?????????i(>=0)?????????

int n, m;
queue<P> que;

void bfs() {
  while (!que.empty()) {
    int dist = que.front().first;
    int team = que.front().second;
    que.pop();

    for (int i = 0; i < n; i++) {
      if (table[team][i] && dp[i] < dist + 1) {
        que.push(P(dist + 1, i));
        dp[i] = dist + 1;
      }
    }
  }
}

int main() {
  int i, j;

  cin >> n >> m;
  for (i = 0; i < m; i++) {
    int s, t;
    cin >> s >> t;
    table[s - 1][t - 1] = true;
  }

  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++)
      if (table[j][i])
        break;
    if (j == n) { // i?????\\???????????????
      que.push(P(
          1,
          i)); //?§?????????????(dp[i]???????????????0????????§??£?????°????????????????????????)
      dp[i] = 1;
    }
  }
  bfs(); //???????????¢?´¢??§dp??¨????????????

  static P perm[5000]; // perm[i] = (??????dp[i], ???????????????i)
  for (i = 0; i < n; i++)
    perm[i] = P(dp[i], i);
  sort(perm, perm + n); //????????§?????????

  bool flag = false;
  for (i = 0; i < n; i++) {
    cout << perm[i].second + 1 << endl;
    if (i + 1 < n && perm[i].first == perm[i + 1].first) {
      flag = true;
    }
  }
  if (flag)
    cout << 1 << endl;
  else
    cout << 0 << endl;
  return 0;
}