通过这道题目我们更加可以看清楚sg函数中的图的一些性质。。
#include<iostream>
#include<vector>
using namespace std;
const int MAXN=1002;
vector<int>v[MAXN];
int dp[MAXN];
int sg(int p)
{
if(dp[p]!=-1)
{
return dp[p];
}
int i;
bool visited[MAXN];
memset(visited,0,sizeof(visited));
for(i=0;i<=int(v[p].size())-1;i++)
{
visited[sg(v[p][i])]=1;
}
i=0;
while(visited[i])
{
i++;
}
return dp[p]=i;
}
int main()
{
int n;
while(cin>>n)
{
memset(dp,-1,sizeof(dp));
int i=0;
for(i=0;i<=n-1;i++)
{
v[i].clear();
}
for(i=0;i<=n-1;i++)
{
int m;
cin>>m;
while(m--)
{
int to;
cin>>to;
v[i].push_back(to);
}
}
int tn;
while(cin>>tn)
{
if(tn==0)
{
break;
}
int sum=0;
while(tn--)
{
int pos;
cin>>pos;
sum=sum^sg(pos);
}
if(sum)
{
cout<<"WIN"<<endl;
}else
{
cout<<"LOSE"<<endl;
}
}
}
return 0;
}