求出各点的sg值
最后看给定点的sg值异或和是否等于0就判好了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#define N 2005
#define M 6005
using namespace std;
int n,m,k,sg[N],first[N],First[N],du[N],cnt=0,ans=0;
bool vis[N];
queue<int>q;
struct edge
{
int v,next;
} e[M],E[M];
void add(int u,int v)
{
e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;
E[cnt].v=u,E[cnt].next=First[v],First[v]=cnt;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=1; i<=m; ++i)
{
scanf("%d%d",&a,&b);
add(a,b),++du[a];
}
for(int i=1; i<=n; ++i)
if(!du[i]) q.push(i);
while(!q.empty())
{
int x=q.front(),tmp=0;
q.pop();
for(int i=first[x]; i; i=e[i].next)
{
int v=e[i].v;
vis[sg[v]]=1,tmp=max(tmp,sg[v]);
}
for(int i=0; i<=tmp+1; ++i)if(!vis[i])
{
sg[x]=i;
break;
}
for(int i=0; i<=tmp; ++i) vis[i]=0;
for(int i=First[x]; i; i=E[i].next)
{
int v=E[i].v;
--du[v];
if(!du[v])q.push(v);
}
}
for(int i=1; i<=k; ++i)
{
int x;
scanf("%d",&x);
ans=ans^sg[x];
}
printf("%s",ans?"win":"lose");
return 0;
}