网络流-最大流常见模型

二分图最大匹配

问题

给定一个二分图 \(G\),即分左右两部分,各部分之间的点没有边连接,要求选出一些边,使得这些边没有公共顶点,且边的数量最大。

解决方法

保留原有部分的连边,将所有连边设为从左向右的容量为 \(1\) 的有向边。将 \(S\) 用容量为 \(1\) 的边连接所有左边的节点,把所有右边的节点用容量为 \(1\) 的边连向 \(T\)

二分图多重匹配

问题

给定一个二分图 \(G\),即分左右两部分,各部分之间的点没有边连接,要求选出一些边,使得每一个点连接的边不超过其上限,且边的数量最大。

解决方法

所有连边方法与二分图最大匹配一致,唯一的不同点就在于与 \(S\)\(T\) 连边的容量为这个点连接的边的上限。

最小不相交路径覆盖

路径的定义

对于一条迹 \(w\),若其连接的点的序列中点两两不同,则称 \(w\) 是一条路径。

注意:一个节点本身也是路径

问题

给定一个有向无环图,找出最少的路径使得这些路径覆盖所有点,并且要求这些路径没有交点。

解决方法

我们可以将 \(n\) 个点拆成 \(2n\) 个点,分别作为图的左部与右部。其中编号为 \(1\)\(n\) 的为左部,编号为 \(n+1\)\(2n\) 的为右部。对于原图中的边 \(x\to y\)\(x\)\(y+n\) 连边,得到一个拆点二分图。得到的 \(\text{最小不相交路径覆盖}=n-\text{二分图最大匹配数}\)

证明

对于任意一个路径,除了起点和终点分别只有一个后继和前驱之外,每一个节点都有前驱和后继。对于每个点 \(x\),将其拆分成两个点 \(x\)\(x+n\),其中 \(x\) 代表前驱节点。\(x+n\) 代表后驱节点,即二分图的左部分和右部分。

为了让最小路径覆盖最小,应该让二分图尽可能连接的边多,即二分图最大匹配。给每个点找到他的前驱和后继,对应选择二对于左部分没有匹配的节点,表示没有后继,对应路径的终点。这样的点的数量就是原图点个数 \(n-\) 二分图的最大匹配数。右部分没有匹配的节点,表示没有前驱,对应路径的起点。因此 \(\text{最小路径覆盖}=n-\text{二分图的最大匹配数}\)

最小不相交路径覆盖

问题

给定一个有向无环图,找出最少的路径使得这些路径覆盖所有点,不强制要求这些路径没有交点。

传递闭包

传递闭包可以使用 floyd 求解,其中 \(f_{x,y}\) 不表示从 \(x\)\(y\) 的最短距离,而表示 \(x\) 是否可以到大 \(y\)

解决方法

使用 Floyd 进行传递闭包,如果 \(f_{x,y}=1\) 那么增加边 \(x\to y\),然后对这个新建出的图进行最小不相交路径覆盖即可。

证明

因为原图在求解 \(x\to y\) 时可能会与其他的边相交导致路线出现相交的情况,但是一旦将 \(x\to y\) 连接起来,那么 \(x\to y\) 的路径就可以直接通过 \(x\to y\) 到达,并不会出现问题。

posted @ 2024-07-12 13:16  未抑郁的刘大狗  阅读(8)  评论(0编辑  收藏  举报