在二分图匹配中有最大匹配问题,使用匈牙利算法或者网络流相关算法解决,如果给每条边增加一个权值,求权值和最大的匹配方案就叫做最大权匹配问题。其实之前所说的最大匹配就是权值为1的最大权匹配。

  求最大权完备匹配常用的方法是Kuhn-Munkres算法(简称KM算法),其主要思想就是通过顶标将求最大权匹配问题转化为求解最大匹配问题。算法的大致思路是任意构造一个可行顶标(比如Y结点顶标为0,X结点的顶标为它出发所有边的最大权值),然后求相等子图的最大匹配,如果存在完美匹配,算法终止,否则修改顶标使得相等子图的边变多,有更大的机会存在完美匹配。

  下面以题为例,给出时间复杂度O(n4)的算法。

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3722

 /*
问题
将任意的两个字符串进行匹配,使得匹配后权值和最大 解题思路
将任意的字符串的权值计算出来,使用KM算法即可。
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn=;
int W[maxn][maxn],n;
char s[maxn][];
int lx[maxn],ly[maxn];
int left[maxn];
bool S[maxn],T[maxn];
int len[maxn]; void presolve();
int KM();
bool match(int i);
void update(); int main()
{
int i,j;
while(scanf("%d",&n) != EOF)
{
for(i=;i<=n;i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
}
presolve(); printf("%d\n",KM());
}
} bool match(int i)
{
S[i]=true;
for(int j=;j<=n;j++) if(lx[i]+ly[j] == W[i][j] && !T[j]){
T[j]=true;
if(!left[j] || match(left[j])){
left[j]=i;
return true;
}
}
return false;
} void update()
{
int a= <<;
for(int i=; i<=n; i++){
if(S[i]){
for(int j=;j<=n;j++){
if(!T[j]){
a = min(a,lx[i]+ly[j] - W[i][j]);
}
}
}
} for(int i=;i<=n;i++){
if(S[i]) lx[i] -= a;
if(T[i]) ly[i] += a;
}
} int KM()
{
for(int i=;i<=n;i++){
left[i] = lx[i] = ly[i] = ;
for(int j=; j<=n; j++)
lx[i]=max(lx[i],W[i][j]);
} for(int i=; i<=n; i++){
for(;;){
for(int j=;j<=n;j++){
S[j]=T[j]=;
}
if(match(i)) break;
else update();
}
} int ans=;
for(int i=;i<=n;i++)
ans += W[left[i]][i];
return ans;
} void presolve()
{
int i,j,k,p1,p2,cnt;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
if(i==j)
{
W[i][j]=;
continue ;
} cnt=;
p1=len[i]-;
p2=;
while()
{
if(s[i][p1]==s[j][p2]) cnt++;
else break ;
p1--,p2++;
if(p1< || p2>=len[j]) break ;
}
W[i][j]=cnt;
}
}
}

KM算法及其应用的更多相关文章

  1. 匈牙利算法与KM算法

    匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...

  2. 【HDU2255】奔小康赚大钱-KM算法

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...

  3. HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法

    二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...

  4. KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼

    感谢  http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...

  5. poj 2195 KM算法

    题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...

  6. hdu 2255 奔小康赚大钱--KM算法模板

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...

  7. HDU(2255),KM算法,最大权匹配

    题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  8. 二分图 最大权匹配 km算法

    这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...

  9. hdu 2255 奔小康赚大钱 KM算法

    看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...

  10. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

随机推荐

  1. boost学习 内嵌类型检测 与 any 的代码练习

    本文是学习 boost源码的一些练习 参考文章来自 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) 目录 http://blog.csdn.net/pongba/ar ...

  2. rabbit初学之连接测试2

    com.rabbitmq.client.ShutdownSignalException: connection error 发现,port是5672,不是15672(15672是后台管理平台的端口)

  3. 第五次spring会议

    昨天所做之事: 昨天我对软件加上了换肤和透明度等功能. 今天所做之事: 我对软件加上了保密功能. private void 一键转密文ToolStripMenuItem_Click(object se ...

  4. 深入C#的String类

  5. W7500P硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ)

    W7500P 硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ) 硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ) 如果您发现商品信息不准确,欢迎纠错 ...

  6. JavaBean四个作用域范围

    使用 useBeans的scope属性可以用来指定javabean的作用范围 page //仅在当前页面有效 request //可以通过HttpRequest.getAttribute()方法取得J ...

  7. VS中编译出现——计算机中丢失XINPUT1_4.dll解决办法

    如果用DX SDK 2010的版本,编译时可能就会出现这种问题. 解决办法,在链接库时把XInput.lib换成XINPUT9_1_0.LIB,重新编译就可以了. 用老操作系统 + 老DX SDK + ...

  8. C++顺序容器之deque初探

    C++顺序容器之deque初探 deque是双端队列,与vector非常相似,是顺序容器,不同的是,deque可以在数组开头和末尾插入和删除数据.支持快速随机访问. #include<iostr ...

  9. ESP32 windows开发环境的搭建(官方方法)

    首先保证电脑中的已经下载了git客户端,没有的自行去https://git-scm.com/下载 STEP1: 获得编译工具链 Windows没有内置的“make”环境,所以安装工具链你将需要一个兼容 ...

  10. Scrum 冲刺博客集合

    Day1 博客链接:http://www.cnblogs.com/coolgirls/p/8869839.html Day2 博客链接:http://www.cnblogs.com/coolgirls ...