KuhnMunkres算法===分析和总结.docx

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

Kuhn-Munkres

Kuhn-Munkres算法(二分图最大权匹配)

二分图如果是没有权值的,求最大匹配。则是用匈牙利算法求最大匹配。如果带了权值,求最大或者最小权匹配,则必须用KM算法。

其实最大和最小权匹配都是一样的问题。只要会求最大匹配,如果要求最小权匹配,则将权值取相反数,再把结果取相反数,那么最小权匹配就求出来了。

KM算法及其难理解。。。看了几天还无头绪。

先拿上一直采用的KM算法模板,按照吉林大学的模板写的。试试了好多次感觉都没有出错。

/******************************************************

二分图最佳匹配(kuhnmunkras算法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

#defineMAXN310

#defineinf1000000000

#define_clr(x)memset(x,-1,sizeof(int)*MAXN)

intKM(intm,intn,intmat[][MAXN],int*match1,int*match2)

{

ints[MAXN],t[MAXN],l1[MAXN],l2[MAXN];

intp,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]];

returnret;

}

下面是从网上的博客摘抄的一些零散的总结。。。。。

[二分图带权匹配与最佳匹配]

什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值之和最大或最小。而二分图的最佳匹配则一定为完备匹配,在此基础上,才要求匹配的边权值之和最大或最小。二分图的带权匹配与最佳匹配不等价,也不互相包含。

这两个的关系比较悬乎。我的理解就是带权匹配是不考虑是不是完备,只求最大或最小权匹配。而最佳匹配则必须在完备匹配的基础上找最大或最小权匹配。

这两个还是结合具体题目比较好理解些。

KM 算法是求最大权完备匹配,如果要求最小权完备匹配怎么办?方法很简单,只需将所有的边权值取其相反数,求最大权完备匹配,匹配的值再取相反数即可。

KM 算法的运行要求是必须存在一个完备匹配,如果求一个最大权匹配(不一定完备)该如何办?依然很简单,把不存在的边权值赋为0。

KM 算法求得的最大权匹配是边权值和最大,如果我想要边权之积最大,又怎样转化?还是不难办到,每条边权取自然对数,然后求最大和权匹配,求得的结果a再算出e^a 就是最大积匹配。至于精度问题则没有更好的办法了。

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

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

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档