LG 题解 CF936B Sleepy Game


目录
  • Solution
  • Code

题目传送

Solution

题意非常的简单,没啥可说的。

先判断 Win 的情况:

你考虑用 \(f_{u,0/1}\) 来表示走到 \(u\) 这个点走了偶(奇)步这个状态有没有出现过。

对于边 \((u,v)\),显然有转移方程:

\[f_{v,0} |= f_{u,1} \]

\[f_{v,1} |= f_{u,0} \]

然后你在记录一个出度。

这样的话,dfs 更新一遍,最后看一看出度为 \(0\) 的点走了奇步这个状态存在没有。

题目要求输出路径,这个操作比较平凡,记录一个 \(pre\) 递归输出即可。

再考虑判断 Draw 的情况。

我们要注意的是 Draw 的优先级比 Lose 要高。估计就我一个人没看出来。

所以在不能走奇步停止的情况下,能进圈就进圈。

一开始我的想法是用 tarjan 缩点,建出新图,接着从 \(s\) 所在点 dfs,看看经过的路径有没有环。但是我写挂了。

考虑另外一种更简单的做法,只从 \(s\)tarjan,记录下缩的最大环。

直接根据这个最大环的大小来判断就可以了。

其他问题看代码。

Code

/*
Work by: Suzt_ilymics
Problem: 不知名屑题
Knowledge: 垃圾算法
Time: O(能过)
*/
#include
#include
#include
#include
#include
#include
#define LL long long
#define orz cout<<"lkp AK IOI!"< 1) puts("Draw");
    else puts("Lose");
    return 0;
}