30tps 求调悬关
查看原帖
30tps 求调悬关
1327857
Endless_summer楼主2024/10/23 22:38

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;
}
  
2024/10/23 22:38
加载中...