AC on #5 #6 #9
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn=50000+10;
const int maxm=50000+10;
int n,cnt=0,num=0,y,k;
int head[maxn],in[maxn],a[maxn];
bool v[maxn];
struct Edge {
int to;
int nxt;
} E[maxm];
void build(int x,int y) {
E[++cnt].to=y;
E[cnt].nxt=head[x];
head[x]=cnt;
in[y]++;
}
queue <int> Q;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d%d",&a[i],&k);
v[a[i]]=1;
while(k--) {
scanf("%d",&y);
build(a[i],y);
}
}
for(int i=1; i<=n; i++) if(!in[a[i]]) Q.push(i);
while(!Q.empty()) {
num++;
int x=Q.front();
Q.pop();
for(int i=head[x]; i; i=E[i].nxt) {
int y=E[i].to;
in[y]--;
if(in[y]==0&&v[x]==1) Q.push(y);
}
}
if(!num) cout<<"YES";
else cout<<n-num;
return 0;
}