重拾网络流,真正感受了它的妙处。
二分图
二分图是什么
简单来说,你可以把一个图分成两部分点,两部分点间有边相连,但是每部分点两两间没有边相连。
二分图判定的充要条件
一个图是二分图的充要条件是不存在奇环。
充分性:对于任意一个二分图,由于每个部分内部都没有边,因此一个点从出去自己部分再回到自己部分都是经过两条边,充分性得证。
必要性:对于一个没有奇环的图,随便钦定一个点为黑色,然后与它相连的点为白色,与白色相连的点为黑色,将整个图染色,我们发现出现同色点之间存在一条边的条件就是存在奇环,所以必要性得证。
怎么判定
- 模拟染色即可
- 使用扩展域并查集,将每个点分成黑白两个点,然后两个点连边就是黑白合并,白黑合并,如果两个点同色已经在同一集合中,说明不是二分图,这个技巧让我们可以动态加边判定二分图,删边可以去了解一下线段树分治。
二分图的最大匹配
二分图最大匹配的意思就是在每个点只被覆盖一次的情况下选最多的边。
如图,这个图的最大匹配是 \(4\)。
那么这个怎么算呢?
我们引入两个概念:
- 交替路:从一个点出发,每次交替走一条匹配边和一条非匹配边
- 增广路:从一个点出发走交替边,这条交替路未匹配边比匹配边多一条。
匈牙利算法的思想就是不断增广,找到最大匹配。
因为增广路把所有交替边和非交替边一反就是一组新的方案。
贪心的不断增广,一定可以找到正确答案。
如果你学了网络流,这里可以这样解释,对于未匹配前,我们所有的点都是有向边,即 \(U\to V\)。对于选过的边,我们建一条 \(V\to U\) 的反边,找到合法方案。
匈牙利算法事件复杂度 \(O(nm)\),可以建网络流模型达到 \(O(n\sqrt m)\)。
König 定理
最小点覆盖:选最少的点,满足每条边至少有一个端点被选。
二分图中,最小点覆盖 \(=\) 最大匹配。
感性理解:如果在最大匹配选的点集中,有一条边两点都没有被选,那么这一定是一个新的匹配。
现在我们来构造并证明这个定理。
Step 1.
把所有边都剔除,只剩下最大匹配选的边,求这些边的最小点覆盖,可以得到:最小点覆盖 \(=\) 最大匹配。所以原图的最小点覆盖 \(\ge\) 最大匹配。我们来证明等号成立。