网络流建模 学习笔记
一、二者取一式问题
二者取一式问题可以这样描述:将若干元素
这个问题可以被转化为网络流中的最小割问题。如果我们把
当我们去割它时,与 cut,边权总和为 sum,则所求最大分值为 sum-cut。
现在我们考虑组合:假设
我们从
现在我们的需求是:只有当
反过来想,当
对于
好了,这就是我们需要的模型。这时我们求最小割 cut,并记非无穷边权和为 sum,那么跟刚刚一样,sum-cut 就是所求分数。
自己的话
其实换一个角度来考虑,把原图看作最大权闭合子图的建模,初始时的每个节点看作 “选
- 在
内的组合初始时就是满足的,所以向汇点连边表示可能的负贡献(修改之后变成不满足了 所以要选某个节点,就一定要选与之相连的) , 组合节点,表示不满足了,需要撤回收益 - 而在
内的组合原来并不满足,向源点连边表示可能的正收益,向组合内成员连边表示如果你要获取这一份收益,你需要把这些成员全部划到 内 - 由于初始时的收益相当于
,而我们的闭合子图权值 的意义相当于价值的变化量,所以最后的总收益就相当于 ,也就是总收益减去最小割
所以我们知道这样的建图手法等价于把问题转化为了最大权闭合子图问题
二、路径覆盖问题
我们再来看能够用网络流模型解决的另一类问题:路径覆盖问题。
这里说的路径覆盖,是在
我们可以使用下面这样的思路:最开始,把每个点自己作为一条路径(这时一共有
但是,要如何保证覆盖数量最少呢?我们可以使用网络流解决这个问题。
接下来,我们以这张
建网络流模型。我们把原图上的每个点拆成两个点(对于点 x,可以把从它拆出去的点记为 x+n
然后对于原 DAG 上的边
这里每一条边的容量均为
实际上,这里本质上就是二分图匹配,所以用匈牙利算法也是可以的,复杂度略差一点。