有些边界处理不好。#5少一个,#6多一个,#9少俩。
#include<bits/stdc++.h>
using namespace std;
n,e[200002],ne[200002],h[200002],hm[200002],idx,k;//e是节点数值,ne是下一个节点的编号,h是编号为i的点所指向的所有点的起点,hm是入度,idx是编号,k是计数器。
bool st[200002];//区分摄像头和区域。
queue<int> q;
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int main(){
memset(h,-1,sizeof(h));
cin>>n;
int a,b,c;
for(int i=1;i<=n;i++){
cin>>a>>b;
while(b){
cin>>c;
add(a,c);
hm[c]++;
b--;
}
st[a]++;
}
for(int i=1;i<=n;i++) if(!hm[i]) q.push(i);
while(!q.empty()){
int p=q.front();
q.pop();
//cout<<p<<endl;
k++;
for(int i=h[p];~i;i=ne[i]){
int j=e[i];
hm[j]--;
if(!hm[j] && st[j]) q.push(j);
}
}
if(k==n) cout<<"YES";
else cout<<n-k;
return 0;
}
~~为什么不能下载数据,呜呜呜~~~