最小割树 学习笔记

Walking_Dead

2020-04-19 18:12:09

Personal

# 最小割树 ## 前言 话说luogu题单真的好妙啊!!!看题单的时候看到了这个东西,这个东西讲真的比字符串多项式那些简单多了。。。 ## 思想 ### 最小割树的定义 给你一张图,每次查询两个点之间的最小割,你应该怎么做? 显然,每次都暴力跑一遍不是我们想要的答案。我们想要更快的方法,那我们应该怎么办呢? 我们想一下,在OI里面什么最好做。**树!!!** 对呀,如果我们可以对于最小割构造出一棵树是不是就好做了呢? 我们定义最小割树为: 边权为原图上的最小割的一棵树,并且对于该树上的一条边$(s,t)$,去掉$(s,t)$这条边之后最小割树上的两棵子树为原图中去掉$(s,t)$的最小割的两个点集。 至于为什么,这就是人类智慧了,等会看到后面的性质应该自然就理解了。 ### 最小割树的构造示例 对于这个问题,我们可以使用分治解决。 考虑对于下面这个图,我们如何构造出最小割树: ![](https://cdn.luogu.com.cn/upload/image_hosting/vwa4nkyh.png) 我们假如一开始选了$\text {A,E}$两个点,那么,它们之间的最小割就为$\text {DE}$。如下图: ![](https://cdn.luogu.com.cn/upload/image_hosting/amvz19oj.png) 那么,我们就可以在最小割树从$\text {A}$向$\text {E}$连一条长度为$4$的边。接着,我们就可以把这个图分成两部分: ![](https://cdn.luogu.com.cn/upload/image_hosting/nch50itv.png) 然后我们再去分别考虑两个点集构造出的最小割树即可。在具体的图上就是继续考虑点集$\text {seta=\{A,B,C,D\}}$以及$\text {setb=\{E\}}$即可。 很显然,对于$\text {setb=\{E\}}$,什么都不需要干。 我们继续考虑$\text {seta=\{A,B,C,D\}}$,我们假设我们继续选$A,C$两点。很显然,最小割应该长成这个样子。 ![](https://cdn.luogu.com.cn/upload/image_hosting/u1b3s65w.png) 于是,我们就可以连一条$A\to C$边权为$12$的边。于是,我们继续分为点集$\{A,B,D\}$和$\{C\}$,显然,我们只需要考虑前一个点集。 显然,后面我们会连$A\to B$边权为$4$,$A\to D$边权为 $7$。因为太显然了,这里就不讲了。 ## 最小割树构造流程 1. 找出最小割(最大流)。 2. 连边。 3. 根据残余网络连通性将代码分成$2$个点集继续考虑。 第$3$步其实就是找到去掉该边之后原图被分出来的两个点集。 ## 最小割树的性质 **两个点之间的最小割为最小割树上的两点之间边权最小值。** 为了证明方便,我们定义$f(x,y)$为原图上$x\to y$的最小割。 --- 在证明之前,我们有几个定理需要了解。 ### 定理1 对于$q\in \text V_x,p\in \text V_y$,有$f(x,y)\geq f(q,p)$ ### 证明 我们使用反证法。 假设$f(p,q)>f(x,y)$,那么,割去$x\to y$的最小割$p,q$依然联通(显然)。那么,就可以$x\to q\to p\to y$,显然与最小割矛盾。得证。 ### 定理2 对于$x,y$,$\forall z$有$f(x,y)\geq \min\{f(x,z),f(z,y)\}$。 ### 证明 因为最小割等于最大流,所以根据最大流的性质这是显然的。(我感觉我的好多东西都是显然啊!!!) ### 定理2推论 对于一个排列$p_1,p_2,..,p_k$,存在: $$f(x,y)\geq \min\{f(x,p_1),f(p_1,p_2),...,f(p_k,y)\}$$ ### 证明 根据定理2显然。 --- 有了上面这些东西我们就可以推导了。 我们假设在最小割树上$(x,y)$之间路径之间权值最小值的端点为$(p,q)$,那么,根据定理2推论可以得到$f(x,y)\geq f(p,q)$,又根据最小割树性质可以得到$x,y$在$p,q$的两旁,所以根据定理1可以得到$f(p,q)\geq f(x,y)$。 综上,$f(p,q)=f(x,y)$。 ## 例题讲解 其实最小割树真正有价值的题目并不是很多,重题似题真的没有必要做。 ### $\text {The 1st}$ [题目传送门 【模板】最小割树](https://www.luogu.com.cn/problem/P4897) ### 题目大意 给定一个$n$个点$m$条边的无向连通图,多次询问两点之间的最小割 ### $\text {Code}$ [戳这里打开](https://www.luogu.com.cn/paste/ufc36wsr) ### $\text {The 2nd}$ [题目传送门 CF343E Pumping Stations](https://www.luogu.com.cn/problem/CF343E) ### 题目大意 一个$n$个点$m$条边的无向图,求出一个排列$a_1,a_2,...,a_n$,使得: $$\sum_{i=2} \text {mincut}(a_{i-1},a_i)$$ 最大,其中,$\text {mincut(i,j)}$表示$i\to j$的最小割。 要求你输出最大值,以及排列$a$。 ### 思路 这道题真的算是少有的比较灵活的应用了。 我们可以发现的是,在最小割树建好以后,一定每条边都会对答案产生影响(必定有两个点会经过此边),那么,最好情况就是每条边只会被计算一次。 虽然理论上这是可行的,但是我们还是需要把它构造出来。 我们还是考虑分治。假如我们现在需要对当前的子树构造出一个最优排列,那我们应该怎么做呢? 我们先找到边权最小的边,然后把该子树从此边分裂成两棵子树继续构造。那为什么这种方法正确性是对的呢?因为分裂出的子树$1$的末位和子树$2$的首位所产生的贡献必定是边权最小边。 边界条件也很简单,直接看还是否有子节点即可。 于是,当我们递归完整颗子树时,我们就可以得到排列了。 ### $\text {Code}$ [戳这里打开](https://www.luogu.com.cn/paste/yb7xt7ca) ### $\text{The 3rd}$ [题目传送门](https://www.luogu.com.cn/problem/P3729) ### 题目大意 有一个$n$个点$m$条边的无向图,每个点都有一个权值。 有$q$次查询,每次查询给出一个$k$,求出一个点集使得两两之间的不相交路径的最小值最大,并且该点集的权值之和不小于$k$。 ### 思路 其实还是很妙的。 首先,我们思考如何求出两个点之间不相交路径条数。这个问题其实可以最大流解决,对于两个点连一条边权为$1$的边,两个点之间的最大流就是答案。 又因为最大流=最小割,于是,两个点之间不相交路径条数就可以使用最小割树查询出来。 然后。。。似乎没有什么头绪啊。。。 我们接着思考,在线似乎不太可行,我们可以把询问离线下来。 我们考虑枚举当前最小割为$w$的时候,显然,所有最小割树上边权比它大的都可以使用。对于当前可以使用的边,我们可以建出一个图。我们可以记录下来每个联通块的点权和(需要提醒的是,这些图上的联通块在原图上不一定是联通块)。 如果有联通块的权值和大于某个询问的$k$,那么,该询问的答案就一定不小于$w$。 考虑这样做为什么是对的,因为边权比它小的都不会出现,在当前合法的情况下一定最优,所以,显然。 ### $\text {Code}$ [戳这里查看](https://www.luogu.com.cn/paste/om4rjvic) ### $\text {The 4th}$ 因为一些特殊原因需要之后才能展现出来。 upd on 2020-08-18: 它死掉了。。。。。。。。。。。。。。。。。。。。 ## 参考博客 https://www.luogu.com.cn/blog/user38148/solution-p4897 https://www.luogu.com.cn/blog/Karry5307/solution-cf343e https://www.luogu.com.cn/blog/Marser/solution-p3729