codeforces 937 D. Sleepy Game(DFS)

题目链接:http://codeforces.com/contest/937/problem/D

思路:其实就是看能不能找到一条为奇数并且出度为0的路线,找不到的话就看能不能找到成环的的。所以可以用一个数组存下到这个点奇偶路线情况,再用一个dfs染色判断是否成环。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define lc (d<<1)
#define rc (d<<1|1)
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
int n,m,dp[100008][2],d[100008],pre[100008][2];
vector<int>g[100008],qw,sz;
void dfs(int x,int y,int z)
{
    dp[y][x&1]=1;
    pre[y][x&1]=z;
    for(int i=0;i<g[y].size();i++)
    {
        if(!dp[g[y][i]][(x+1)&1])  dfs(x+1,g[y][i],y);
    }
}
bool huan(int x)
{
    d[x]=1;
    bool f=0;
    for(int i=0;i<g[x].size();i++)
    {
        if(d[g[x][i]]==1) f=1;
        else if(!d[g[x][i]]) f=huan(g[x][i]);
        if(f)  return 1;
    }
    d[x]=2;
    return 0;
}
int main()
{
    cin.tie(0);
    cin>>n>>m;
    int x,y,s;
    FOR(i,1,n)
    {
        si(x);
        if(!x)  qw.push_back(i);
        while(x--)
        {
            si(y);
            g[i].push_back(y);
        }
    }
    si(s);
    dfs(0,s,0);
    for(int i=0;i<qw.size();i++)
    {
        if(dp[qw[i]][1])
        {
            puts("Win");
            int k=qw[i],z=1;
            while(pre[k][z]!=0)
            {
                sz.push_back(k);
                k=pre[k][z];
                z=1-z;
            }
            sz.push_back(k);
            for(int j=sz.size()-1;j>=0;j--)  cout<<sz[j]<<" ";
            puts("");
            return 0;
        }
    }
    if(huan(s))  puts("Draw");
    else  puts("Lose");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40858062/article/details/80172949