思路
不断删入度为1的点及其出边。
图解
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
vector<int> vec[maxn];
int InDeg[maxn],seq[maxn],tot;
int T,N,M;
bool topological()
{
queue<int>q;
tot=0;
for (int i=1;i<=N;i++) {
if (!InDeg[i]) {
q.push(i);
seq[tot++]=i;
}
}
int cnt=0;
while (!q.empty()) {
int u=q.front();
q.pop();
cnt++;
for (int i=0;i<vec[u].size();i++) {
if (--InDeg[vec[u][i]]==0) {
q.push(vec[u][i]);
seq[tot++]=vec[u][i];
}
}
}
return cnt==N?true:false;
}
int main()
{
scanf("%d",&T);
while (T--) {
scanf("%d%d",&N,&M);
for (int i=1;i<=N;i++) {
vec[i].clear();
}
memset(InDeg,0,sizeof(InDeg));
int x,y;
for (int i=0;i<M;i++) {
scanf("%d%d",&x,&y);
vec[x].push_back(y);
InDeg[y]++;
}
printf("%s
",topological()?"Correct":"Wrong");
// for (int i=0;i<tot;i++) {
// printf("%d ",seq[i]);
// }
}
return 0;
}