彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖

本文深入探讨了二分图的概念及其在匈牙利算法中的应用,包括最大匹配、最小路径覆盖、最大独立集等问题,并通过实例解析了如何解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


彻底搞定二分图的匈牙利算法,最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖:


二分图简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。准确地说:把一个图的顶点划分为两个不相交集 U V ,使得每一条边都分别连接 U V 中的顶点。如果存在这样的划分,则此图为一个二分图。二分图的一个等价定义是:不含有「含奇数条边的环」的图!如下图:

                                   U集合                                                               V集合

                                


匹配:在图论中,一个「匹配」是一个边的集合,其中任意两条边都没有公共顶点!如下图:


                                              


最大匹配:一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配!上图已将是最大匹配!

完美匹配:如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。

说起二分图,一定少不了匈牙利算法!

 交替路:从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。

增广路:从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路



                                            

     下面列一条增广路:

 

  

最小路径覆盖:

最小路径覆盖(path covering):是“路径” 覆盖“点”,即用尽量少的不相交简单路径覆盖有向无环图G的所有顶点,即每个顶点严格属于一条路径。路径的长度可能为0(单个点)!

最小路径覆盖数=G的点数-最小路径覆盖中的边数:

         应该使得最小路径覆盖中的边数尽量多,但是又不能让两条边在同一个顶点相交。拆点:将每一个顶点i拆成两个顶点Xi和Yi。然后根据原图中边的信息,从X部往Y部引边。所有边的方向都是由X部到Y部。因此,所转化出的二分图的最大匹配数则是原图G中最小路径覆盖上的边数。因此由最小路径覆盖数=原图G的顶点数-二分图的最大匹配数便可以得解。

       

二分图的性质

二分图中,点覆盖数是匹配数。
    (1) 二分图的最大匹配数等于最小覆盖数,即求最少的点使得每条边都至少和其中的一个点相关联,很显然直接取最大匹配的一段节点即可。
    (2) 二分图的独立数等于顶点数减去最大匹配数,很显然的把最大匹配两端的点都从顶点集中去掉这个时候剩余的点是独立集,这是|V|-2*|M|,同时必然可以从每条匹配边的两端取一个点加入独立集并且保持其独立集性质。
    (3) DAG的最小路径覆盖,将每个点拆点后作最大匹配,结果为n-m,求具体路径的时候顺着匹配边走就可以,匹配边i→j',j→k',k→l'....构成一条有向路径。

     (4)最大匹配数=左边匹配点+右边未匹配点。因为在最大匹配集中的任意一条边,如果他的左边没标记,右边被标记了,那么我们就可找到一条新的增广路,所以每一条边都至少被一个点覆盖。

     (5)最小边覆盖=图中点的个数-最大匹配数=最大独立集。

    这里针对题目做下训练:

  有关匈牙利算法的最大匹配:

         HDOJ_1150 任务安排:

          

有两台机器A和B以及k个需要运行的任务。每台机器有n,m种不同的模式,而每个任务都恰好能在一台机器上运行。 
机器A上有模式 mode_0, mode_1, …, mode_n-1,机器B上有模式: mode_0, mode_1, … , mode_m-1。 
开始的工作模式都是mode_0。每个任务有对应的运行模式,(i, x, y)表示i任务对应的A B机器上的运行模式mode_x, mode_y。 
每台机器上的任务可以按照任意顺序执行,但是每台机器每转换一次模式需要重启一次。 
请合理为每个任务安排一台机器并合理安排顺序,使得机器重启次数尽量少。并求其值。 
分析:
每个任务要有对应A B机器的模式中至少要有一种来运行,问题转化为,求二分图中最少的点(模式)使得每个边(模式对应的任务)至少和其中的一个点覆盖。 
也就是二分图最小顶点覆盖问题!
 
      相应题目要求和AC代码及注释

  有关匈牙利算法的最小路径覆盖数:
    hdoj 1151 Air Raid
          有一个城镇,它的所有街道都是单行的,并且每条街道都是和两个路口相连。同时已知街道不会形成回路。现在要一些伞兵去巡查这个城镇,伞兵只能沿着路的方向走,你的任务是编写程序求最小数量的伞兵,使这些伞兵可以访问所有的路口。对于伞兵的起始降落点不做限制。

    其实就是给一个m个点n条边的有向无环图,求该图的最小路径覆盖。

    最小路径覆盖数=顶点数-最大匹配数。

  相应的题目和AC代码及注释:

 
  有关匈牙利算法的最大独立集:
      hdoj 1068 Girls and Boys

                

大学二年级的时候,一些同学开始研究男女同学之间的缘分。研究者试图找出没有缘分同学的最大集。程序的结果就是要输出这个集合中学生的数量。

3 ----男孩和女孩一共3个

0:

(2) 
1 2 ---- 0号与两个人会恋爱:1,2号

1: (1) 0 ---同上解释

2: (1) 0

 图中点的个数-最大匹配数=最大独立集

分析明显的二分图模型,但是输入没有指明那些是男孩/女孩。所以要拆点,把

i 拆成 i 跟 i' 分别放入X、Y,构造二分图。原先U = V - M,所以 2U = 2V - 2M。
分析:

        故U = n - M'/2。

       相关的题目要求和AC代码及注释:

           http://blog.youkuaiyun.com/zhangxiaoxiang123/article/details/48348207


 

        


                     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值