CC GRAPHCNT - Counting on a directed graph 题解

首先建出支配树,如果两个点有除了 1 以外的公共支配点那就废了。那么就猜想,仅有公共支配点 1 这个条件也是充分的,这样就相当于求 \(\mathrm{LCA}(x,y)=1\)​ 的点对数量,就太简单了。网上所有题解都对这个猜想的证明一笔带过(不给证明写个铲铲的题解),仿佛很显然一样,我曾一度怀疑是不是世界上只有我一个人是弱智。后来找到了 CC 上的官方题解才发现确实挺难证的。

下面通篇翻译(bushi)CC 官方题解,就当报复一下社会。


之前做的支配树题最多是节点去截路径,这次是两条路径互刚了,所以在相邻两支配点之间走的路径交不交也是要考虑的。对支配树上相邻两个节点 \((x,y)\),其中 \(x\)\(y\) 的最近支配点,我们来考察一下 \(x\to y\) 所有可能的路径中所有可能的节点 \(z\) 有哪些:\(z\) 显然不被 \(y\) 支配,因为存在 \(1\to x\to z\) 的不经过 \(y\) 的路径,所以 \(z\) 一定不属于子树 \(y\);而 \(z\) 又肯定被 \(x\) 支配,否则存在 \(1\to z\to y\) 的不经过 \(x\) 的路径,与 \(x\) 支配 \(y\) 矛盾,所以 \(z\) 一定属于子树 \(x\)。总结下来就是 \(z\) 可能是 \(\operatorname{subtree}(x)-\operatorname{subtree}(y)-\{x\}\)​ 中任意一个节点。这样对任意支配树上直链,它每一条边都是独立的一节,可以分开来分析。

其实刚才挖的过深了。设 \(1\to x\)​​ 在支配树上为 \(1=x_0\to x_1\to\cdots\to x_n=x\)​​,\(1\to y\)​​ 为 \(y_{0\sim m}\)​​,则跟据上面的理论 \(x_1\to x_n\)​​ 的任意路径的任意节点都是 \(x_1\)​​​​ 的后代,\(y_1\to y_m\)​​ 也都是 \(y_1\)​​ 后代,而 \(\mathrm{LCA}(x,y)=1\)​​,易知 \(\operatorname{subtree}(x_1)\cap\operatorname{subtree}(y_1)=\varnothing\)​​。所以 \(x_1\to x_n,y_1\to y_m\)​​ 这两条路径是永不相交的,接下来只需要考虑 \(1\to x_1,1\to y_1\)​​ 与之相交性。

先尝试构造 \(1\to x_1\)​ 与 \(y_1\to y_m\)​ 不相交,那么必不经过 \(y_1\)​​​,而一旦不经过 \(y_1\)​,它也无法经过 \(y_1\)​ 支配的 \(y_{2\sim m}\)​,所以这就等价于要找 \(1\to x_1\)​ 不经过 \(y_1\)​。这就是节点刚路径,由于 \(y_1\)​ 不支配 \(x_1\)​,一定存在不经过 \(y_1\)​ 的 \(1\to x_1\)​ 路径。然后考虑找不交于 \(1\to x\)\(1\to y_1\)​ 路径,找到了就 win 了。

现在先来扯一些其它事情:对两个不相邻的点 \(x,y\)​​​,如果 \(x\to y\)​​​ 不存在必经点,那么必存在两条除端点外不相交的 \(x\to y\)​​ 路径。回想起学点双、边双的时候双连通的两个等价定义:无必经边 / 点,以及存在两条没有交边 / 点的路径(两点一边的点双除外),当时在 blog 没有给出证明,想当然地认为很好证,仔细想想发现并不会从前者推出后者。其实有 / 无向图必经边 / 点问题专门有个定理叫门杰定理,是拓展版,内容是最小的割边 / 点集大小为 \(k\)​​ 当且仅当最多有 \(k\)​​​ 条互不相交路径。证明非常巧妙的运用最大流最小割定理,那么有向图就显然了,必经点可以点边转化;而无向图最大流、最小割看似不会做(当年还以为不可做来着 2333),其实都将无向边正反建两条边即可:最大流中易证一条边正反走两遍一定不是最优,最小割中一组割 \((S,T)\)​ 只要割掉 \(S\to T\)​​ 的边的 \(S\to T\) 方向有向边,恰与原无向边一一对应。

扯完了,继续证明。由于 \(1\)​​ 最近支配 \(y_1\)​​,\(1\)​​ 和 \(y_1\)​​ 之间没有必经点。如果存在边 \((1,y_1)\)​​ 那就 win 了对不;否则必存在 \(1\to y_1\)​​​ 的两条除端点不相交路径,如果其中有一条跟 \(1\to x\)​​​ 不交那就 win 了,否则设两者与 \(1\to x\)​​ 交点按顺序分别为 \(a_{1\sim s},b_{1\sim t}\)​​。不妨设 \(a_s\)​​ 比 \(b_t\)​​ 离 \(1\) 更远,那么我们可以先沿着第一条路径走到 \(a_s\) 之后沿原定 \(1\to x\) 路径后半段走到 \(x\) 作为新 \(1\to x\) 路径,然后走第二条路径作为 \(1\to y_1\),这样 \(b_{1\sim t}\)\(1\to x\) 上全部消失了,而 \(a\)\(b\)​ 又不交,证毕!​​

posted @ 2021-08-24 16:57  ycx060617  阅读(91)  评论(0编辑  收藏  举报