二分图的匈牙利算法与常用定理小节

=====================================[ 前言 ]=====================================


最近做二分图的题目,定理比较多,这里做个小节理清下思路。

关于二分图的相关概念可以参见“二分图大讲堂”,内容很全面。


注:以下用G表示二分图,V表示G的顶点集,X和Y分别表示G的两个顶点子集。

    E[x][y]表示X中的顶点x至Y中顶点y的边,E[x][y]=1表示边存在,E[x][y]=0表示边不存在。


=================================[ 二分图的判定 ]=================================


二分图是“顶点集可划分为两个互不相交的子集且使得图中任意一条边所关联的两个顶点分别属于这两个顶点子集中”的无

向图。


判定二分图的常用方法是染色法:

1、对图中任意一顶点染色。

2、如果有刚刚染色的顶点P,则执行第3步,否则执行第4步。

3、考虑P的所有相邻顶点Q,若Q未染色则将其染为P的反色并返回第2步,若Q已染色且颜色与P相同则说明该图不是二分图并结束算法。

4、该图是二分图。

这一算法用DFS即可简洁得实现。


=================================[ 二分图的建立 ]=================================


根据题意建立二分图的首要任务是确定X和Y,这得视具体情况而定。

但是如果题目给出的明显是一个图,那么就只需要根据题意将给出图的V划分为X和Y即可。

这里可以利用判定二分图所用的“染色法”来将V划分为X和Y,但为了避免麻烦,更一般的处理如下述。


1、无向图:

            

令X=Y=V,如果无向图中存在x至y的边则令E[x][y]=E[y][x]=1。

但这样求出的最大匹配和最佳完美匹配结果需要除以二,因为每条边都被计算了两次。

比如HDU1068:Girls and Boys就是这样一个情况。


2、有向图:

           

令X=Y=V,将X和Y分别作为有向图中边的始点集和终点集,如果有向图中存在x至y的边则令E[x][y]=1。

这样求出的最佳完美匹配结果一般就是最终答案,但具体情况还得视题意而定。

注意一点,将有向图转换为二分图处理的话,必须确保有向图中不存在自身环(从顶点到自身的边),否则可能出错。

比如HDU3488:Tour中就明确指出:一个环至少包含两个城市,也就是说不存在自身环。

 

上述的处理可以简化算法过程但却会增大算法时间复杂度常数,因为处理后图的顶点数翻倍,无向图处理后边数也会翻倍。

                      

==================================[ König定理 ]==================================

 

二分图最大匹配的König定理:最小点覆盖数 = 最大匹配数。


点覆盖集是一个“使得所有边至少有一个端点在集合中”的点集,或者说是点集覆盖了所有的边。

 

二分图中很常用很基础的定理,感觉Matrix67神牛的证明有点难懂,这里自己证明下。

 

首先证明:二分图中最小点覆盖数不可能小于最大匹配数。


         根据匹配的定义“匹配是一个边集,满足边集中的边两两不邻接”可知任意一个点都不可能连接两条匹配边。

         也就是说任选一个点最多只能覆盖一条匹配边,那么最小点覆盖数便不可能小于最大匹配数。


然后证明:任意二分图中选取最大匹配数个点就可以覆盖所有的边。


         1、所有点都是匹配点的二分图(以下用G1表示这种图)中选取最大匹配数个点就可以覆盖所有的边。

           

           显然可知:图中每一条边的两个顶点必定都是匹配点,并且分别位于X和Y中。

           也就是说:只需要选取X中的所有匹配点或者Y中的所有匹配点就可以覆盖图中所有的边。

    

         2、只有一个点是未盖点的二分图(以下用G2表示这种图)中选取最大匹配数个点就可以覆盖所有的边。


           显然可知:G2只是在G1的基础上添加了一个未盖点。

           那么就有:这个未盖点要么只与X中的匹配点相连要么只与Y中的匹配点相连(否则G2就不是二分图了)。

           所以得到:相应得只需选取X中的所有匹配点或者Y中的所有匹配点便仍可覆盖图中所有的边。

  

         为什么证明之前两点?因为任意一个二分图都可以划分为互不相交的有限个G1和有限个G2!

         划分过程如下所述:

         1、如果G中有未盖点,执行第2步,否则执行第3步。

         2、选取与未盖点连通的所有点,因为这些点必定是匹配点(否则存在增广路),所以这个未盖点与这些匹配点以及它

            们间的边便构成了一个G2。从G中删除G2,返回第1步。

         3、如果G中还有点,那么剩余的这些点必定是匹配点,所以这些匹配点以及它们间的边便构成了一个G1。

         而由于这有限个G1和G2互不相交,那么覆盖G中的所有边等同于分别覆盖这有限个G1和G2的所有边。

         又根据在G1和G2中都有“选取最大匹配数个点就可以覆盖所有的边”,显然可知在G中这一结论仍然成立。


综上两点:二分图最大匹配的König定理“ 最小点覆盖数 = 最大匹配数 ”成立。


================================[ 最大独立集定理 ]================================


二分图的最大独立集定理:最大独立集 = 顶点数 - 最大匹配数


独立集是一个“使得集合中的顶点两两互不相邻”的点集。


“从G中选取尽可能多的点,使得选取的这些点两两之间没有边。”也就是“从G中删除尽可能少的点,使得剩下的这些点两两之间没

有边。”。

求前者选取的点的个数也就是求最大独立集,求后者删除的点的个数也就是求最小点覆盖,那么显然就有:

最大独立集 = 顶点数 - 最小点覆盖数 = 顶点数 - 最大匹配数


===============================[ 最小路径覆盖定理 ]===============================


DAG的最小路径覆盖定理:最小路径覆盖数 = 顶点数 - 最大匹配数。


路径覆盖集是一个“使得集合中的路径两两互不相交且图中每个顶点严格属于集合中一条路径”的简单路径集合。


看了博文“最小路径覆盖问题值得注意的地方”,这个问题倒是真的值得注意,但是一楼的评论才是正解。


一、网上一个不错的证明:


    不想写了,直接看原文吧:最小路径覆盖

    

二、我的证明:


    证明ING。。。


===================================[ The End ]===================================

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值