二分图(2粉兔)

以下为随便写的总结,也许应该不严谨

二分图定义等

定义:可以分成两个部分使得每一条边的两个点都是不同部分的图是2粉兔。

总结:没有奇环

所以我们可以用染色大法,在连通块内随便找个点染 1 号颜色,然后它连的点都染 2 号颜色,以此类推。每个连通块都染完以后染 1 号颜色的扔到一个部分,染 2 号颜色的扔到另外一个部分。

匹配

定义:

选一些边使得任意两条边都没有公共点(书上定义是图中两两没有公共端点的边构成的边集 \(M\),若满足 \(M\subseteq E\),则称为匹配)

匹配点:有匹配边依附的点

(在二分图中↓)

最大匹配:选边最多的匹配

完全匹配:选边个数 \(=\) 点数 \(/2\)(全是匹配点)

最佳匹配:如果每条边带权,则权值和最大的匹配是最佳匹配

最佳完备匹配:权值和最大的完全匹配

增广路:起点终点为非匹配点,路径是非匹配边和匹配边交替的路径

性质:

1.长度为奇数

2.匹配的边集 xor 增广路边集 是比原本匹配边数 \(+1\) 的匹配

3.当一个匹配没有增广路时它就是最大匹配

证明:必要性:一眼丁真

充分性:设 \(M\) 是没有增广路的匹配,\(M'\) 是最大匹配,\(H=(V,M xor M')\),由 xor 定义得知 \(H\) 中属于 \(M'\) 的边比 \(M\)

由匹配的定义得知 \(H\) 中连通块一定是一条链,而且是 \(M\) 的边 和 \(M'\) 的边 交替。

一定有一个连通块 \(M'\) 的边 \(>M\) 的边。

可以发现把这个连通块的 \(M\) 边都换成 \(M'\) 边没有冲突,反证可得,所以有增广路。

算法:

1.匈牙利算法

总结:一直找增广路

流程:先增加一个点,然后沿着 非匹配边-匹配边 的路径走,如果碰到非匹配点直接修改点集

可以发现每个点被遍历一次就好了,多遍历几次不会改变结果,于是打个标记时间复杂度就没问题了

因为加 \(n\) 次点,每次加点最坏情况要遍历整个边集,所以时间复杂度为 \(O(nm)\)

2.网络流

源点连左部点,右部点连汇点,把边的容量都改成 \(1\)

用 dinic 据说是 \(O(n\sqrt n)\),这是为啥呢?

其他:(不一定是二分图)

边覆盖:任意顶点都被选的边覆盖

若没有孤立点,则 \(|最大匹配|+|最小边覆盖|=|V|\)

如果 \(|最小边覆盖|<|V|-|最大匹配|\) 那说明在边覆盖中有更多的边有效覆盖掉 \(2\) 个点,所以矛盾。

最小边覆盖构造方法:先选最大匹配的边,剩下点随便选一条连它的边

独立集:两两互不相连的点集 \(S\),若满足 \(S\subseteq V\),则称为独立集

顶点覆盖:任意边都有至少一个端点属于 \(S\)

二分图最小点覆盖=最大匹配

构造方法:从一部分点的非匹配点出发,沿着“非匹配边——匹配边”地走,这一部分点没有遍历的点和另外一部分遍历的点合起来就是最小点覆盖。

蠢方法证明:对于匹配边来说肯定有一个端点被遍历,对于非匹配边来说如果下面是匹配点,那么上面一定不会被遍历,否则存在增广路(因为“非匹配边出发,非匹配边结束”)

对于一个匹配边来说不可能两个端点都选,对于非匹配边来说被选的端点一定是匹配点,反证,如果非匹配点被选,当它在这一部分点时不可能,当它在另一部分点时被遍历则存在增广路。

upd:

Hall 定理

当一部点任意点集连向另一点集的点集大小 >= 这个点集的大小时,二分图该部点都被匹配。

End!

posted @ 2025-03-14 11:02  myzzym  阅读(26)  评论(0)    收藏  举报