P6560 [SBCOI2020] 时光的流逝

P6560 [SBCOI2020] 时光的流逝

博弈论水题

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n,m,qq;
queue<int> q;
int cn;
int cntt[100001];
int tu[100001],ct[100001];
int x,y;
int p;
int sg[100001];
int head[100001];
struct e{
	int to;
	int ne;
}ed[500005];
void add(int f,int to){
	p++;
	ed[p].to=to;
	ed[p].ne=head[f];
	head[f]=p;
}
void ini(){
	for(int i=1;i<=n;++i){
		sg[i]=0;
		ct[i]=tu[i];
	}
	sg[y]=1;
	while(!q.empty())
		q.pop();
	for(int i=1;i<=cn;++i){
		sg[cntt[i]]=1;
		q.push(cntt[i]);
		
	}
}
void del(int r){
	for(int i=head[r];i;i=ed[i].ne){
		if(sg[ed[i].to]) continue;
		if(sg[r]==1){
			sg[ed[i].to]=2;
			q.push(ed[i].to);
		}else{
			ct[ed[i].to]--;
			if(ct[ed[i].to]==0){
				sg[ed[i].to]=1;
				q.push(ed[i].to);
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&qq);
	for(int i=1;i<=m;++i){
		scanf("%d%d",&x,&y);
		add(y,x);
		tu[x]++;
	}
	for(int i=1;i<=n;++i){
		if(tu[i]==0){
			cntt[++cn]=i;
		}
	}
	for(int i=1;i<=qq;++i){
		scanf("%d%d",&x,&y);
		ini();
		q.push(y);
		del(y);
		while(!q.empty()){
			int z=q.front();
			q.pop();
			if(sg[x])
			break;
			del(z);
		}
		if(sg[x]==1){
			printf("-1\n");
		}
		if(sg[x]==0){
			printf("0\n");
		}
		if(sg[x]==2){
			printf("1\n");
		}
	}
	return 0;
}
posted @ 2021-08-20 18:46  Simex  阅读(39)  评论(0编辑  收藏  举报