codeforces 937 D. Sleepy Game(DFS)

xiaoxiao2021-02-28  35

题目链接: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; }

 

转载请注明原文地址: https://www.6miu.com/read-2622539.html

最新回复(0)