KM算法及其应用
在二分图匹配中有最大匹配问题,使用匈牙利算法或者网络流相关算法解决,如果给每条边增加一个权值,求权值和最大的匹配方案就叫做最大权匹配问题。其实之前所说的最大匹配就是权值为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算法及其应用的更多相关文章
- 匈牙利算法与KM算法
匈牙利算法 var i,j,k,l,n,m,v,mm,ans:longint; a:..,..]of longint; p,f:..]of longint; function xyl(x,y:long ...
- 【HDU2255】奔小康赚大钱-KM算法
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description ...
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼
感谢 http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...
- poj 2195 KM算法
题目链接:http://poj.org/problem?id=2195 KM算法模板~ 代码如下: #include "stdio.h" #include "string ...
- hdu 2255 奔小康赚大钱--KM算法模板
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:有N个人跟N个房子,每个人跟房子都有一定的距离,现在要让这N个人全部回到N个房子里面去,要 ...
- HDU(2255),KM算法,最大权匹配
题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- 二分图 最大权匹配 km算法
这个算法的本质还是不断的找增广路: KM算法的正确性基于以下定理:若由二分图中所有满足A[i]+B[j]=w[i,j]的边(i,j)构成的子图(称做相等子图)有完备匹配,那么这个完备匹配就是二分图的最 ...
- hdu 2255 奔小康赚大钱 KM算法
看到这么奇葩的题目名我笑了,后来这么一个裸的KM调了2小时我哭了…… 这是个裸的KM算法,也没什么多说的,主要是注意多组数据时,每次都要把各种数组清空啊,赋值啊什么的,反正比较麻烦.至于为什么调了2小 ...
- hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...
随机推荐
- redis在游戏服务器中的使用初探(一) 环境搭建
这里我们尝试在游戏服务器中的数据处理中使用redis 通过该系列文章能够学习 redis的基本操作 源码编译 客户端开源库的编译和使用 以及在游戏服务器中的缓存使用 作为初次摸索 尽量使得环境简单 ...
- 【Mybatis】MyBatis配置文件的使用(二)
本例在[Mybatis]MyBatis快速入门(一)基础上继续学习XML映射配置文件 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properti ...
- 【Git】 GitLab配置优化及汉化
GitLab配置 1.修改GitLab绑定的域名 a.修改/etc/gitlab/gitlab.rb配置文件,修改成自己的域名 external_url 'http://gitlab.example. ...
- # 2019-2020-3 《Java 程序设计》第四周总结
2019-2020-3 <Java 程序设计>第四周知识总结 第五章:继承 1.定义继承关系的语法结构: [修饰符] class 子类名 extends 父类名 { 类体定义 } 父类中应 ...
- jQuery的事件,动画效果等
一.事件 click(function(){}) 点击事件 hover(function(){}) 悬浮事件,这是jQuery封装的,js没有不能绑定事件 focus(function(){}) ...
- Python11/26--mysql之视图/触发器/事务/存储过程
视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...
- IOS xib和代码自定义UIView
https://www.jianshu.com/p/1bcc29653085 总结的比较好 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件. 下面就来说说自定义View的封装 ...
- 巧用 Jersey RESTful WebService框架解决文件上传乱码
一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...
- 用installshield2013 将winform程序打包成exe执行程序
前期准备工作 1,一个已经测试通过的winform程序 2,安装好的installshield2013插件 ps:一般VS都没有安装此插件,需要自己去下载 打包步骤 1,新建一个打包程序 ps:如 ...
- 代码的重构(Refactor-Extract)
1.vs中的代码重构快捷方式:Refactor-Extract: 选中两个需要重构的部分完整代码,右击,选中Refactoe-Extract-Extract Method: 该选中的代码会自动形成一个 ...