Kuhn-Munkres算法.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Kuhn-Munkres算法

二分图如果是没有权值的,求最大匹配。则是用匈牙利算法求最大匹配。如果带了权值,求最大或者最小权匹配,则必须用KM算法。其实最大和最小权匹配都是一样的问题。只要会求最大匹配,如果要求最小权匹配,则将权值取相反数,再把结果取相反数,那么最小权匹配就求出来了。KM算法及其难理解。。。看了几天还无头绪。先拿上一直采用的KM算法模板,按照吉林大学的模板写的。试试了好多次感觉都没有出错。/******************************************************二分图最佳匹配(kuhn munkras 算法 O(m*m*n)).邻接矩阵形式。返回最佳匹配值,传入二分图大小m,n邻接矩阵 mat ,表示权,match1,match2返回一个最佳匹配,为匹配顶点的match值为-1,一定注意m=n,否则循环无法终止,最小权匹配可将全职取相反数。初始化: for(i=0;iMAXN;i++) for(j=0;jMAXN;j++) mat[i][j]=-inf;对于存在的边:mat[i][j]=val;//注意不能负值********************************************************/#includestring.h#define MAXN 310#define inf 1000000000 #define _clr(x) memset(x,-1,sizeof(int)*MAXN)int KM(int m,int n,int mat[][MAXN],int *match1,int *match2){int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN];int p,q,i,j,k,ret=0;for(i=0;im;i++) { l1[i]=-inf;for(j=0;jn;j++) l1[i]=mat[i][j]l1[i]?mat[i][j]:l1[i];if(l1[i]==-inf) return -1; } for(i=0;in;i++) l2[i]=0; _clr(match1); _clr(match2);for(i=0;im;i++) { _clr(t); p=0;q=0;for(s[0]=i;p=qmatch1[i]0;p++) {for(k=s[p],j=0;jnmatch1[i]0;j++) {if(l1[k]+l2[j]==mat[k][j]t[j]0) { s[++q]=match2[j]; t[j]=k;if(s[q]0) {for(p=j;p=0;j=p) { match2[j]=k=t[j]; p=match1[k]; match1[k]=j; } } } } } if(match1[i]0) { i--; p=inf;for(k=0;k=q;k++) {for(j=0;jn;j++) {if(t[j]0l1[s[k]]+l2[j]-mat[s[k]][j]p) p=l1[s[k]]+l2[j]-mat[s[k]][j]; } } for(j=0;jn;j++) l2[j]+=t[j]0?0:p;for(k=0;k=q;k++) l1[s[k]]-=p; } } for(i=0;im;i++) ret+=mat[i][match1[i]];return ret; } 下面是从网上的博客摘抄的一些零散的总结。。。。。[二分图带权匹配与最佳匹配]什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档