题目概述:
判断有没有成正环。
思路:
拓扑排序。统计从队列中取出的数的个数,如果个数等于n,则是没有成环的,可完成任务调度。
如果成环了,在环外的分支出去之后,队列就为空了(成环的节点入度始终不为0),因此入队的数小于n。
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N = 105;
int d[N], q[N*5];
int n;
bool st[N][N];
int main() {
cin >> n;
for(int i = 1; i <= n; ++ i) {
int k;
cin >> k;
while(k --) {
int x;
cin >> x;
d[i] ++;
st[x][i] = true;
}
}
int hh = 0, tt = -1, cnt = 0;
for(int i = 1; i <= n; ++ i)
if(!d[i]) {
q[++tt] = i;
}
while(hh <= tt) {
int t = q[hh ++];
++ cnt;
for(int i = 1; i <= n; ++ i) {
if(st[t][i]) {
if(--d[i] == 0) q[++tt] = i;
}
}
}
//cout << cnt << endl;
if(cnt < n) puts("0");
else puts("1");
return 0;
}