一般我是不会给图论题写博客的,但这题是个相当综合的思路题所以就写一下.
题意
给一张有向图,起点 s s s有一颗棋子,两人轮流移动,移动不了的一方失败.现在由于你的对手睡觉去了,所以你可以替她移动.如果棋子不会停止,则平局,问你能得到的最优结局.如果你能赢,输出一种移动情况.
题解
从
s
s
s开始搜索,每个点有两个状态
0
/
1
0/1
0/1,表示走到这个点的是我还是对手.
如果走到不能走了并且当前的状态为
1
1
1,则我赢,直接输出从
s
s
s到这个点的路径并结束.
如果怎么都搜不到我赢的状态,则判路上有没有环,有环输出平局,否则只能输了.
就是这样了,谢谢大家.
const int yuzu=2e5;
typedef int fuko[yuzu|10];
fuko vis[2];
vector<int> lj[yuzu|10],path;
int main() {
int n,m,i;
read(n),read(m);
for (i=1;i<=n;++i) {
for (read(m);m--;)
lj[i].push_back(read());
}
int s,win=1,cir=0;
function<int(int,int)> dfs=[&](int u,int p) {
vis[p][u]=-1;
for (auto v:lj[u]) {
if (!win) break;
vis[!p][v]?~vis[!p][v]||++cir:dfs(v,!p);
}
win-=!lj[u].size()&&p;
if (!win) path.push_back(u);
return vis[p][u]=1;
};
read(s),dfs(s,0);
if (!win) {
puts("Win");
reverse(path.begin(),path.end());
for (int g:path) printf("%d ",g);
} else {
puts(cir?"Draw":"Lose");
}
}