Rorschachindark
2020-04-19 18:12:09
话说luogu题单真的好妙啊!!!看题单的时候看到了这个东西,这个东西讲真的比字符串多项式那些简单多了。。。
给你一张图,每次查询两个点之间的最小割,你应该怎么做?
显然,每次都暴力跑一遍不是我们想要的答案。我们想要更快的方法,那我们应该怎么办呢?
我们想一下,在OI里面什么最好做。树!!! 对呀,如果我们可以对于最小割构造出一棵树是不是就好做了呢?
我们定义最小割树为:
边权为原图上的最小割的一棵树,并且对于该树上的一条边
至于为什么,这就是人类智慧了,等会看到后面的性质应该自然就理解了。
对于这个问题,我们可以使用分治解决。
考虑对于下面这个图,我们如何构造出最小割树:
我们假如一开始选了
那么,我们就可以在最小割树从
然后我们再去分别考虑两个点集构造出的最小割树即可。在具体的图上就是继续考虑点集
很显然,对于
我们继续考虑
于是,我们就可以连一条
显然,后面我们会连
我们使用反证法。
假设
对于
因为最小割等于最大流,所以根据最大流的性质这是显然的。(我感觉我的好多东西都是显然啊!!!)
对于一个排列
根据定理2显然。
有了上面这些东西我们就可以推导了。
我们假设在最小割树上
综上,
其实最小割树真正有价值的题目并不是很多,重题似题真的没有必要做。
题目传送门 【模板】最小割树
给定一个
戳这里打开
题目传送门 CF343E Pumping Stations
一个
最大,其中,
要求你输出最大值,以及排列
这道题真的算是少有的比较灵活的应用了。
我们可以发现的是,在最小割树建好以后,一定每条边都会对答案产生影响(必定有两个点会经过此边),那么,最好情况就是每条边只会被计算一次。
虽然理论上这是可行的,但是我们还是需要把它构造出来。
我们还是考虑分治。假如我们现在需要对当前的子树构造出一个最优排列,那我们应该怎么做呢?
我们先找到边权最小的边,然后把该子树从此边分裂成两棵子树继续构造。那为什么这种方法正确性是对的呢?因为分裂出的子树
边界条件也很简单,直接看还是否有子节点即可。
于是,当我们递归完整颗子树时,我们就可以得到排列了。
戳这里打开
题目传送门
有一个
有
其实还是很妙的。
首先,我们思考如何求出两个点之间不相交路径条数。这个问题其实可以最大流解决,对于两个点连一条边权为
又因为最大流=最小割,于是,两个点之间不相交路径条数就可以使用最小割树查询出来。
然后。。。似乎没有什么头绪啊。。。
我们接着思考,在线似乎不太可行,我们可以把询问离线下来。
我们考虑枚举当前最小割为
如果有联通块的权值和大于某个询问的
考虑这样做为什么是对的,因为边权比它小的都不会出现,在当前合法的情况下一定最优,所以,显然。
戳这里查看
因为一些特殊原因需要之后才能展现出来。
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