拓扑排序的巧妙应用
发现题目就是求入度为0的点 , 拓扑排序一波就好
#include<bits/stdc++.h>
#define N 10050
using namespace std;
int first[N],next[N],to[N],tot;
int n,p,isp[N],du[N],ans,vis[N];
void add(int x,int y){
next[++tot]=first[x],first[x]=tot,to[tot]=y;
}
void bfs(){
queue<int> q; for(int i=1;i<=p;i++)
if(!du[i] && isp[i]) q.push(i),vis[i]=1;
while(!q.empty()){
int x = q.front(); q.pop();
if(isp[x]) ans--;
for(int i=first[x];i;i=next[i]){
int t=to[i]; if(!(--du[t])&&!vis[t])
q.push(t),vis[t]=1;
}
}
}
int main(){
scanf("%d",&n); ans = n;
for(int i=1;i<=n;i++){
int x,m; scanf("%d%d",&x,&m);
p = max(p,x); isp[x] = 1;
for(int j=1;j<=m;j++){
int y; scanf("%d",&y);
add(x,y); du[y]++; p = max(p,y);
}
} bfs(); if(ans==0) printf("YES");
else printf("%d",ans); return 0;
}