在二分图匹配中有最大匹配问题,使用匈牙利算法或者网络流相关算法解决,如果给每条边增加一个权值,求权值和最大的匹配方案就叫做最大权匹配问题。其实之前所说的最大匹配就是权值为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 用文本来提供输入信息的模板,不用每次都手动粘贴了

    #下面这一段用一个txt来保存input的信息来模拟input.最后提交代码时候删除这一段即可. a9999=open('1.txt','r') def input(): return a9999.r ...

  2. Zookeeper Client基础操作和Java调用

    ## Zookeeper > Zookeeper目前用来做数据同步,再各个服务之前同步关键信息 i.客户端操作 1. 创建 create [-s] [-e] path data acl -s 为 ...

  3. ios下面的按钮和inout框

    在ios系统中,按钮和输入框,会默认给你加一个圆角和阴影,可以用css去掉这个自带的属性 input[type=button], input[type=submit], input[type=file ...

  4. Django的学习进阶(一)—— 外键的使用

    一.描述 在利用django做网络开发的时候我们会遇到一个问题就是,我们建立了多张数据表,但是多张数据表中的内容是不一样的,但是之间有着联系比如: 我有两张表,一张是记录歌曲信息的内容,一张是对歌曲操 ...

  5. orabbix监控oracle

    Orabbix 是一个用来监控 Oracle 数据库实例的 Zabbix 插件.下载地址: http://www.smartmarmot.com/product/orabbix/download/ O ...

  6. jmeter+Jenkins持续集成(邮件通知)

    jmeter构建后,自送发送邮件到指定的邮箱,配置如下 1)Jenkins Location配置 jenkins首页->系统管理->系统配置页面 其中Jenkins URL有默认值,最好修 ...

  7. 1119 Pre- and Post-order Traversals

    Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...

  8. Python简介及环境安装

    Python 官网传送门 Python是一种面向对象的解释性计算机程序设计语言. Python 2.7将于2020年1月1日终止支持,本笔记基于Python3. pip pip 是一个现代的,通用的 ...

  9. html 基本用法

    html表单表格基本用法,直接贴代码. <html> <head> <title>html基础</title> </head> </b ...

  10. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...