这个题目一看就是记忆化搜,只有深搜肯定超时,如果不状态压缩成奇偶的话,数组开不下,记忆化搜索就是一个套路,不再赘述,我开始只有深搜,超时了发现要记忆化。
#include <bits/stdc++.h>
#define ff first
#define ss second
#define mp make_pair
using namespace std;
typedef long long ll;
vector<int> G[100005];
bool mark[100005][2];
int vis[100005][2];
int dp[100005][2];
int p[100005][2];
bool hasCycle;
bool f(int v, int j) {
if(G[v].empty()) return j == 1;
if(mark[v][j]) return dp[v][j];
vis[v][j] = 1;
bool ret = false;
for(int x : G[v]) {
if(vis[x][j^1] == 1) hasCycle = true;
else if(f(x, j^1)) {
p[v][j] = x;
ret = true;
}
}
vis[v][j] = 0;
mark[v][j] = 1;
return dp[v][j] = ret;
}
void print(int v, int j) {
printf("%d ", v);
if(p[v][j]) print(p[v][j], j^1);
}
int main () {
int n,m,s;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) {
int q,b;
scanf("%d", &q);
while(q--) {
scanf("%d", &b);
G[i].push_back(b);
}
}
scanf("%d", &s);
if(f(s,0)) {
printf("Win\n");
print(s,0);
}
else if(hasCycle) printf("Draw\n");
else printf("Lose\n");
return 0;
}