关于二分图的姿势

二分图最大匹配

求二分图最大匹配常用简单算法为匈牙利算法。

交错轨:从二分图右边的某个没有匹配的点,走出一条“一条没被匹配、一条已被匹配、一条没被匹配、……、一条没被匹配”交替出现的路径。

大致思路:每次从一个还没有匹配过的点开始寻找交错轨,然后将路径上匹配的边和没有匹配的边反向,这样可以使匹配数加一,直到找不到为止。


下面介绍二分图匹配的一些运用:解决最小边覆盖、最小路径覆盖、 最小顶点覆盖 、最大独立集 、 最大团问题以及求最大匹配的必配边和必配点。


- 相关定义

Ps:G为给定图。

边覆盖:求一个边集,使G中的所有点是集合中某条边的邻接顶点。
点覆盖:求一个点集,使G中的所有边都至少有一个端点属于这个集合。
路径覆盖:用尽量少的不相交简单路径覆盖G中的所有节点。
独立集:即一个点集,集合中任意两个节点不相邻。
团:即一个点集,集合中任两个结点相邻。
二分图的补图:对于二分图中左边一点x和右边一点y,若x和y之间有边,那么在补图中没有,否则有。
注意:求解路径覆盖时G为DAG。


- König定理

二分图的最大匹配数等于这个二分图的最小顶点覆盖数。

简单证明:最大匹配后,原图中已经不存在交错轨。


- 解决方法

最小顶点覆盖:由König定理可知。

最小路径覆盖:建图:把所有节点分成V和V’,分别表示出和入,对于V->U的有向边,我们建V->U’的有向边,这样可以把DAG转换为一张二分图。
现在考虑每次在二分图里加一条边就相当于把两条路径合成了一条路径,因为匹配的过程中路径之间不可能有公共点,所以最大匹配就是将最多的路径进行合并,所以有最小路径覆盖=|V|-最大匹配

最小边覆盖:假设我们已经求好最大匹配为M,那么有2*M个点被覆盖,剩下n-2*M点需要分别连接一条边,那么最后的答案就是n-M。

最大独立集:最大独立集=n-最小顶点覆盖。简单证明:如果除选定节点外的任意两个节点有边,那么当前顶点没有完全覆盖,所以这个式子成立。

最大团:最大团=补图的最大独立集。这个方法很好理解,因为最大独立集是两两不相邻,所以最大独立集的补图也就是当前图两两相邻。
注意:在二分图中我们假设任意一边的节点两两相邻。


- 最大匹配的必配边必配点

解决这类问题我们通常采用排除的方法。
首先我们需要进行一次最大匹配。

对于必配点:我们将匹配的边从右往左连,不匹配的边从左往右连。
这个时候一条增广路成为一条连续的路径。
从每个左边未匹配的点开始遍历,如果被一个左边的点被访问到,说明存在一条增广路,也就是该点不一定在最大匹配中。
剩下节点为必配点。

对于必配边:首先tarjan缩点,如果一条匹配边处在任意一个强连通分量中,该边肯定不是必配边。然后从任意一个未匹配点出发,遍历一条增广路,停止时发现这条增广路上的边数是偶数,那么该增广路上的所有匹配边都不是必配边(可以把该增广路上的路径反一下,最大匹配不变),剩下的匹配边为必配边。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值