网络流建模
二分图最大匹配
内容
将边分成匹配和非匹配边,使每个点相邻的匹配边数量 。
思路
考虑刻画限制数量 ,而最大流是容易刻画数量限制的。利用二分图,分别对左右部点进行处理即可。
即对于二分图 ,其中 和 为左右部点集,可构建源点 和汇点 ,从 向 中每个点连容量为 的边,从 中每个点向 连容量为 的边,原图中的边容量设为 。通过求 到 的最大流,可得到二分图的最大匹配。
当然,也可以认为这要转化成刻画选择,可以用最小割,但复杂度更差。
集合划分问题
内容
设有 个物品,对于每个物品 ,选择 有代价 ,选择 有代价 ,对于某些物品对 ,若 和 不在同一集合,有额外代价 ,求总代价最小的划分方案。
思路
涉及到集合划分的,常见做法是最小割,因为最小割容易刻画“选择”。
套路的考虑让割边表示选择,构建源点 和汇点 。对于每个物品 ,从 向 连容量为 的边,从 向 连容量为 的边。对于存在代价 的物品对 ,在 和 之间连双向边,容量为 。通过求 到 的最小割,可得到最小总代价。
二分图最小点覆盖
内容
对于二分图 ,选出一个大小最小的点集 ,使得 ,都有 或 。
思路
刻画选择,所以考虑最小割。
考虑什么时候不合法,就是一条边两个端点都不选。
构建源点 和汇点 ,从 向 中每个点连容量为 的边,从 中每个点向 连容量为 的边。对于原图中的每条边 ,其中 ,,从 向 连容量为 的边。通过求 到 的最小割,割边所关联的点集即为最小点覆盖集。
二分图最大独立集
和最小点覆盖是补问题。即对于二分图 ,设最小点覆盖集为 ,则最大独立集为 。
最大权闭合子图
内容
给定有向图 ,每个点 有一个权值 ,求一个子图 ,其中 ,,且对于任意 ,若 ,则 ,使得 最大。
思路
刻画选择,考虑最小割。
先把最大转最小,设所有点权和为 ,我们要最大化的是 ,那么等价于最小化 。
构建源点 和汇点 ,对于权值为正的点 ,从 向 连容量为 的边;对于权值为负的点 ,从 向 连容量为 的边。原图中的边容量设为 。通过求 到 的最小割, 减去最小割的值即为最大权闭合子图的权值。
最小DAG路径覆盖
不相交
每个点恰被一条路径覆盖,求所需的最小路径数量。
思路
限制难处理,考虑重新刻画。
点没前途,考虑边,发现限制就是每个点的入边选择数量 且出边选择数量 ,然后要让选的边最多。
具体做法是将每个点 拆成 和 ,从 向每个 连容量为 的边,从每个 向 连容量为 的边。对于原图中的边 ,从 向 连容量为 的边。通过求 到 的最大流 ,最小路径覆盖数为 。
当然,直接做也可以,用最小费用最大流可以实现相同复杂度。
可相交
将“恰”改为“至少”。
思路
考虑刻画之,但没什么想法,尝试直接做。
DP不行,看网络流,这其实是有下界的最小流。
直接用上下界最小费用可行流即可。
当然,也可以考虑重新刻画路径的本质。
将所有点划分成若干集合,限制是集合内部的点满足相邻可达。
那我们只关心可达性,对原图进行传递闭包,设得到的图为 ,然后在 上用不相交路径覆盖的方法求解。
切糕问题
内容
来自HNOI2013。
思路
考虑直接做,dp几乎不可能,考虑用割刻画选择。
设有一个 的网格,每个网格点 有 到 种取值,每种取值有不同的代价,同时存在一些限制条件,要求在满足限制条件下,选择一种取值方案使得总代价最小。
将待选的值 顺次连成一条链,即对于每个网格点 ,从取值为 的节点向取值为 的节点连容量为对应代价的边()。对于不合法限制,通过连边刻画,例如如果限制 和 取值差不能超过某个值,可在相应取值节点间连容量为 的边。通过求最小割,可得到最小总代价。
szzjz WiKi