二分图最大匹配
问题
给定一个二分图 \(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\) 到达,并不会出现问题。
标签:二分,连边,路径,匹配,覆盖,模型,常见,网络,节点 From: https://www.cnblogs.com/liudagou/p/18298171