[图论记录]P7353 [2020-2021 集训队作业] Tom & Jerry

command_block

2021-05-19 21:13:43

Personal

**题意** : 给定一张包含 $n$ 个顶点和 $m$ 条边的 **无向连通图**,Tom 和 Jerry 在图上进行了 $q$ 次追逐游戏。 在第 $i$ 次游戏中,Tom 一开始位于顶点 $a_i$,而 Jerry 一开始位于顶点 $b_i$(双方任何时候都知道自己和对方的位置),追逐规则如下: - Jerry 和 Tom 交替行动,Jerry 先行动。 - Jerry 每次行动可以通过无向图中的 **任意多条边**(可以选择不移动),但是在移动过程中不能经过 Tom 当前所在的结点,否则就会被抓住。 - Tom 每次行动只能通过无向图中的 **至多一条边**(可以选择不移动)。 - 如果 Tom 在一次行动后到达了 Jerry 的位置,那么 Tom 胜利。 Tom 尽量想要胜利,而 Jerry 会尽量阻止 Tom 胜利。 现在你需要对于每一局游戏,求出 Tom 是否一定能在有限次行动内获胜。 $n,m,q\leq 10^5$ ,时限$\texttt{1s}$。 ------------ - **Observation 1** 考虑图点双联通的情况。此时,无论 Tom 在哪个点,Jerry 都能到达图中任意一点。 当 Tom 的点满足到其他点的距离均为 $1$ (称之为**覆盖点**),则 Jerry 下一步会被捉住。若不存在这样的点,则永远不可能捉住。 对原图建立广义圆方树。 对于 Jerry 而言,移动规则可以改为 : 在圆方树上任意移动,但不能经过猫所在的圆点。目的地也一定是圆点(方点在原图中本不存在) 可以将两人的位置状态描述为 $(u,S)$ ,表示 Tom 在节点 $u$ ,而 Jerry 可以到达的点集为 $S$。 进一步地, $S$ 必然是 $u$ 的某个分支。于是可以用树上的一条边来描述一个状态。 具体地,记 $(u,v)$ 表示 Tom 在 $u$ 点, Jerry 在 $v$ 点方向,其中 $v$ 点与 $u$ 点直接相连。 对于圆方树上的一条边(一定是圆方边),若圆点距离方点代表点双的其他圆点均为 $1$ ,则称该圆点为该点双的覆盖点,这条边为覆盖边。 - **Observation 2** 由于 Tom 是想要结束追捕的一方,故 Tom 在原地等待必然是不优的。 而且 Tom 若扩大(指 $\rm superset$) Jerry 的活动范围,也必然是不优的。 > 根据 Observation 1,Jerry 可以在目前的点双(记为 $A$)中与 Tom 打游击,若 $A$ 中没有覆盖点,则 Jerry 胜。 反之, Tom 为了将 Jerry 逼出 $A$ ,必然走到 $A$ 的某个覆盖点。此时 Jerry 选择某个分支逃走(注意,不能选择 Tom 所在的分支), Tom 则一步上前封锁该分支。 若 Tom 前往下一个点双 $B$ 之后,到达的第一个点是 $B$ 的覆盖点,则又轮到 Jerry 选择一个分支前往。这是类似的问题。 若 Tom 到达的第一个点不是 $B$ 的覆盖点,则必须离开这个点,此时 Jerry 可以趁机回到原来的点双 $A$。 则 Tom 必须回到 $A$ ,若到达的第一个点不是 $A$ 的覆盖点,类似地, Jerry 可以趁机回到 $B$。如此周而复始。 若 Tom 回到 $A$ 时到达的第一个点是 $A$ 的覆盖点,则 Jerry 选择另一个分支潜入, Tom 继续追击。 > 能够发现,(圆 $\rightarrow$ 方点) 的非覆盖边,够使得老鼠有一次往回走的机会。 > 可以进一步推广到,对于两条这样的边 $(a\rightarrow b),(a'\rightarrow b')$,若以 $a$ 为根建立外向树时,边的方向为 $(a'\rightarrow b')$ ,则能够反复横跳。 > 称这两条割边是“匹配的”。 称“不存在覆盖点的点双”为**好结构**。 - **树中存在好结构** 显然,若 Jerry 的活动范围内有好结构,则 Jerry 获胜。接下来考虑没有的情况。 - 若当前的 $u$ 不是覆盖点,则 Tom 必须移动。 然后 Jerry 可以前往 Tom 原来守护的割边的另一头。 Jerry 在 Tom 移动前后的活动范围的并集是整棵树。 则 Jerry 必然可以找到好结构,必胜。 于是 Tom 不能经过非覆盖边。进一步地,若 Jerry 的活动范围中有这种边,跑到后面躲起来就好了。 否则,不难发现 Jerry 必败。 - **树中不存在好结构** 此时 Jerry 只能利用两条非覆盖边反复横跳取胜。 若活动范围内不存在任何一条这样的边, Jerry 必败。 若存在某一条,且树中存在能反复横跳的两个非覆盖边, Jerry 必胜,否则必败。 简要证明 : 下图是 Tom 经过一条非覆盖边的情况 : ![](https://cdn.luogu.com.cn/upload/image_hosting/6i8jwplb.png) 其中,红点代表覆盖点,绿圈代表 Tom 所在的点,蓝色范围代表 Jerry (可能)的活动范围。 观察 Jerry 能得到那些可能的匹配。 - A 内部的 - B 内部的 - C 内部的 - A,B 之间的 - A,C 之间的 似乎只剩 B,C 之间的匹配不能获得。但是不难发现,若 B,C 之间存在一组匹配,则将 C 中的那条边与 $u\rightarrow t$ 匹配即可。 于是,若图中存在匹配,则 Jerry 总能得到匹配。 分析完毕,现在考虑具体实现。 - 建立圆方树 - 判定覆盖点 - 判定好结构 - 判定是否存在匹配 : 简易点分治 - 判定活动范围内是否存在好结构 “活动范围”总能被表示成一棵子树,或一棵子树的补集。 - 判定活动范围内是否存在方向正确的非覆盖边 将询问离线下来,然后再换根的同时求解。问题就能转化为单点修改子树求和,树状数组即可。 复杂度 $O(n\log n+m)$。 ```cpp ```