在二分图匹配中有最大匹配问题,使用匈牙利算法或者网络流相关算法解决,如果给每条边增加一个权值,求权值和最大的匹配方案就叫做最大权匹配问题。其实之前所说的最大匹配就是权值为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. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  2. VM无法连接到虚拟机

    The VMware Authorization Service is not running. 原因 虚拟机服务没有开启 解决方法 1.      我的电脑右击->管理 2.      打开服 ...

  3. XamlWriter-将对象树写入Xaml

    WPF通常用Xaml格式创建对象树.您还可以使用XamlWriter类进行反方向操作——将对象树写入Xaml. 对于XamlWriter来说,将对象转换成良好的Xaml表示形式通常很容易.但是,您不能 ...

  4. js实现抽奖

    抽奖.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  5. POJ2455 Secret Milking Machine

    Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12324   Accepted ...

  6. leetcode144-先序遍历非递归实现

    二叉树的先序/中序/后序遍历递归/非递归实现,讲的很清楚,其中后序遍历和先序中序的处理有些不一样: https://blog.yangx.site/2016/07/22/Python-binary-t ...

  7. cad2013卸载/安装失败/如何彻底卸载清除干净cad2013注册表和文件的方法

    cad2013提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装cad2013失败提示cad2013安装未完成,某些产品无法安装,也有时候想重新安装cad2013 ...

  8. Codeforces gym102152 K.Subarrays OR

    传送:http://codeforces.com/gym/102152/problem/K 题意:给定$n(n\le10^5)$个数$a_i(a_i\le10^9)$,对于任一个子数组中的数进行或操作 ...

  9. hadoop安装hive及java调用hive

     1.安装hive 在安装hive前,请确保已经安装好了hadoop,如未安装,请参考centoos 安装hadoop集群进行安装: 1.1.下载,解压 下载hive2.1.1:http://mirr ...

  10. HTTP 协议基础概念和报文结构

    基础概念 1.WWW(World Wide Web,万维网)构建技术有3项: (1)把SGML(Standard Generalized Markup Language,标准通用标记语言)作为页面的文 ...