- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 就是最大积匹配。至于精度问题则没有更好的办法了。
二
您可能关注的文档
- join in打印 六年级下册英语 单元教案.docx
- join in打印 六年级下册英语复 单元教案.docx
- join in打印 四年级下册英语 单元教案.docx
- Join in小学英语六年级第二学期第一阶段测试题.docx
- Joinin 三年级英语上学期期末复习.docx
- joinin四年级上册复习资料.docx
- Joinin四年级上英语期末测试题.docx
- JQUERY 模仿QQ聊天界面=.docx
- jq公开课教案分析和总结.docx
- JSP程序设计期末试卷A题目及其答案.docx
- 中国行业标准 GM/T 0126-2023HTML密码应用置标语法.pdf
- 《JJF 2121-2024恒转速源校准规范》.pdf
- 餐饮服务中20条处理要点.docx
- 《GM/T 0011-2023可信计算 可信密码支撑平台功能与接口规范》.pdf
- 《JJF 2134-2024旋转流变仪校准规范》.pdf
- JJF 2121-2024恒转速源校准规范.pdf
- 计量规程规范 JJF 2121-2024恒转速源校准规范.pdf
- 《JJF 2118-2024压力式六氟化硫气体密度控制器校验仪校准规范》.pdf
- JJF 2134-2024旋转流变仪校准规范.pdf
- 计量规程规范 JJF 2134-2024旋转流变仪校准规范.pdf
文档评论(0)