二分图匹配归纳.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
二分图匹配归纳

这几天断断续续学了二分图的匹配算法,学会了二分图的最大匹配的hungary算法和求二分图的最佳匹配的KM算法. 二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。 hungary算法就是一个不断找增广轨的过程. 下面是网上找到的一个比较好的解释,很容易理解,结合程序就能掌握算法的思想了: 算法的思路是不停的找增广轨,并增加匹配的个数,增广轨顾名思义是指一条可以使匹配数变多的路径,在匹配问题中,增广轨的表现形式是一条交错轨,也就是说这条由图的边组成的路径,它的第一条边是目前还没有参与匹配的,第二条边参与了匹配,第三条边没有..最后一条边没有参与匹配,并且始点和终点还没有被选择过.这样交错进行,显然他有奇数条边.那么对于这样一条路径,我们可以将第一条边改为已匹配,第二条边改为未匹配...以此类推.也就是将所有的边进行反色,容易发现这样修改以后,匹配仍然是合法的,但是匹配数增加了一对.另外,单独的一条连接两个未匹配点的边显然也是交错轨.可以证明,当不能再找到增广轨时,就得到了一个最大匹配.这也就是匈牙利算法的思路. hungary算法适合解决的问题: 1.最大匹配(=,=显然....) 2.完美匹配 3.点覆盖(最小覆盖问题) 4.最小路径覆盖 5.最大独立集问题 参考网上的代码写的一个算法,好像用的人蛮多的 #define N 100 int bm[N][N],link[N],v[N]; int n,m; int path(int t) { ???? int i; ???? for(i=1;i=m;i++) ???????? if(!v[i] bm[t][i]) ????????? { ????????????? v[i]=1; ?????????????? if(!link[i] || path(link[i])) ?????????????? { ????????????????? link[i]=t; ????????????????? return 1; ?????? } ?? } return 0; } int maxmatch() { ???? int i,c=0; ???? memset(link,0,sizeof(link)); ???? for(i=1;i=n;i++) ???? { ??????? memset(v,0,sizeof(v)); ????????? if(path(i)) ????????? c++; ???? } ???? return c; } 二分图的最佳匹配:算法是理解了,可是定理没有证明=,=.哎,这就是工科生和理科生的区别... 【最优完备匹配】 对于二分图的每条边都有一个权(非负),要求一种完备匹配方案,使得所有匹配边的权和最大,记做最优完备匹配。(特殊的,当所有边的权为1时,就是最大完备匹配问题) KM算法:(全称是Kuhn-Munkras,是这两个人在1957年提出的,有趣的是,匈牙利算法是在1965年提出的) 为每个点设立一个顶标Li,先不要去管它的意义。 设vi,j为(i,j)边的权,如果可以求得一个完备匹配,使得每条匹配边vi,j=Li+Lj,其余边vi,j≤Li+Lj。 此时的解就是最优的,因为匹配边的权和=∑Li,其余任意解的权和都不可能比这个大 定理:二分图中所有vi,j=Li+Lj的边构成一个子图G,用匈牙利算法求G中的最大匹配,如果该匹配是完备匹配,则是最优完备匹配。 (不知道怎么证明) 问题是,现在连Li的意义还不清楚。 其实,我们现在要求的就是L的值,使得在该L值下达到最优完备匹配。 L初始化: Li=max{wi,j}(i∈x,j∈y) Lj=0 建立子图G,用匈牙利算法求G的最大匹配,如果在某点i (i∈x)找不到增广轨,则得不到完备匹配。 此时需要对L做一些调整: 设S为寻找从i出发的增广轨时访问的x中的点的集合,T为访问的y中的点的集合。 找到一个改进量dx,dx=min{Li+Lj-wi,j}(i∈S,j不∈T) Li=Li-dx (i∈S) Li=Li+dx (i∈T) 重复以上过程,不断的调整L,直到求出完备匹配为止。 从调整过程中可以看出: 每次调整后新子图中在包含原子图中所有的边的基础上添加了一些新边。 每次调整后∑Li会减少dx,由于每次dx取最小,所以保证了解的最优性。 复杂度分析: 设n为点数,m为边数,从每个点出发寻找增广轨的复杂度是O(m),如果找不到增广轨,对L做调整的复杂度也是O(m),而一次调整或者找到一条增广轨,或者将两个连通分量合成一个,而这两种情况最多都只进行O(n)次,所以总的复杂度是O(nm) 扩展: 根据KM算法的实质,可以求出使得所有匹配边的权和

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档