拓补排序
找入度为零的,就是没被监视的,删掉
继续找入度为零的,继续删
直到找不到
输出答案
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
int n,t;int r[199999],c[1999][1999],a[19999],f,flag[19999];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d%d",&a[i],&x);
c[a[i]][0]=x;
//printf("\n%d %d",a[i],c[a[i]][0]);
for(int j=1;j<=c[a[i]][0]; j++)
{
scanf("%d",&x); c[a[i]][j]=x;
r[x]++;
}
}
f=1;
while(f)
{
f=0;
for(int i=1;i<=n;i++)
if(r[a[i]]==0&&!flag[a[i]])
{
++t,f=1;flag[a[i]]=1;
for(int j=1;j<=c[a[i]][0];j++)
r[c[a[i]][j]]--;
}
}
if(t==n)printf("YES");
else printf("%d",n-t);
}