题目要求就是找一条从s出发,到出度为零的点,步数为奇数的路。
如果找不到,那么如果有环,就输出有环,否则就lose。
第一步就是dfs,遍历从s出发 ,到每个点奇数/偶数步是否可以到达,并记录路径。
之后我们就是按三步走即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<cstring>
using namespace std;
vector<int>mp[100005];
int dp[100005][2];
int pre[100005][2];
int vis[100005];
int zishu[100005];
int ans[100005];
int flag;
void dfs(int st,int step)
{
for(int i=0;i<mp[st].size();i++)
{
int to=mp[st][i];
if(vis[to]==1)//如果之前访问过了
{
flag=1;//出现环
}
if(dp[to][(step+1)%2])
continue;
pre[to][(step+1)%2]=st;
dp[to][(step+1)%2]=1;
vis[to]=1;
dfs(to,(step+1)%2);
vis[to]=0;
}
}
int main()
{
int n,m;
cin>>n>>m;
memset(zishu,0,sizeof(zishu));
flag=0;
for(int i=1;i<=n;i++)
{
cin>>zishu[i];
for(int j=0;j<zishu[i];j++)
{
int v;
cin>>v;
mp[i].push_back(v);
}
}
int s;
cin>>s;
dp[s][0]=1;
vis[s]=1;
dfs(s,0);
for(int i=1;i<=n;i++)
if(!zishu[i])
{
if(dp[i][1])
{
int tot=0;
printf("Win\n");
int now=i,f=1;
while(now!=s||f!=0)
{
ans[tot++]=now;
now=pre[now][f];
f^=1;
}
printf("%d",s);
for(int i=tot-1;i>=0;i--)
printf(" %d",ans[i]);
printf("\n");
return 0;
}
}
if(flag)printf("Draw\n");
else printf("Lose\n");
}