二分匹配之最大权值匹配算法---KM模板
大神总结:http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html
代码:
#include<stdio.h>
#include<string.h>
const int N=,INF=0x3f3f3f3f;
int lx[N],ly[N],vx[N],vy[N],slack[N],match[N];
int a[N][N];
int nx,ny;
int dfs(int u)
{
vx[u]=;
for(int i=;i<=ny;i++)
{
if(vy[i]) continue;
int t=lx[u]+ly[i]-a[u][i];
if(t==)
{
vy[i]=;
if(match[i]==-||dfs(match[i]))
{
match[i]=u;
return ;
}
}
else if(slack[i]>t)
slack[i]=t;
}
return ;
}
int KM()
{
int i,j,d;
memset(ly,,sizeof(ly));
memset(match,-,sizeof(match));
for(i=,lx[i]=-INF;i<=nx;i++)
for(j=;j<=ny;j++)
if(a[i][j]>lx[i])
lx[i]=a[i][j];
for(i=;i<=nx;i++)
{
memset(slack,0x3f,sizeof(slack));
while()
{
memset(vx,,sizeof(vx));
memset(vy,,sizeof(vy));
if(dfs(i)) break;
d=INF;
for(j=;j<=ny;j++)
if(!vy[j]&&slack[j]<d)
d=slack[j];
//if(d==INF) break;//该点找不到任何匹配
for(j=;j<=nx;j++)
if(vx[j])
lx[j]-=d;
for(j=;j<=ny;j++)
{
if(vy[j])
ly[j]+=d;
else
slack[j]-=d;
}
}
}
int ans=,sum=;
for(i=;i<=ny;i++)
if(match[i]>-&&a[match[i]][i])
ans+=a[match[i]][i],sum++;
printf("%d++\n",sum);//匹配数
return ans;
}
int main()
{
int m,u,v,w,n,i;
scanf("%d",&nx);
scanf("%d",&ny);
scanf("%d",&m);
memset(a,,sizeof(a));
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
a[u][v]=a[v][u]=w;
}
printf("%d\n",KM());
return ;
}
二分匹配之最大权值匹配算法---KM模板的更多相关文章
- HDU2255-奔小康赚大钱-二分图最大权值匹配-KM算法
二分图最大权值匹配问题.用KM算法. 最小权值的时候把权值设置成相反数 /*-------------------------------------------------------------- ...
- POJ 2400 Supervisor, Supervisee(KM二分图最大权值匹配)题解
题意:n个老板n个员工,先给你n*n的数据,i行j列代表第i个老板第j喜欢的员工是谁,再给你n*n的数据,i行j列代表第i个员工第j喜欢的老板是谁,如果匹配到第k喜欢的人就会产生一个分数k-1.现在让 ...
- 奔小康赚大钱 HDU - 2255(最大权值匹配 KM板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- hdu 1853 Cyclic Tour (二分匹配KM最小权值 或 最小费用最大流)
Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Total ...
- kuangbin带你飞 匹配问题 二分匹配 + 二分图多重匹配 + 二分图最大权匹配 + 一般图匹配带花树
二分匹配:二分图的一些性质 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j ...
- 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Tour HDU - 3488(最大权值匹配)
Tour In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one- ...
- hdu 1853 Cyclic Tour 最大权值匹配 全部点连成环的最小边权和
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Others) ...
- poj3565 Ants km算法求最小权完美匹配,浮点权值
/** 题目:poj3565 Ants km算法求最小权完美匹配,浮点权值. 链接:http://poj.org/problem?id=3565 题意:给定n个白点的二维坐标,n个黑点的二维坐标. 求 ...
随机推荐
- 【Android】开源项目UI控件分类汇总之Dialog
接前文ProgressBar:Android开发的宝库越来越多,我开发中有需要的组件,主要参考Trinea的大作Android开源项目分类汇总(包含了后面的绝大多数).CSDN上直接拿来用!最火的An ...
- Silverlight的TextWrapping
Silverlight中TextBox的TextWrapping属性,作用是获取或设置 TextBlock 对文本进行换行的方式. 默认值为 TextWrapping.NoWrap. TextWrap ...
- ArcGIS快捷键导出
在以前的文章中说过怎样恢复ArcGIS默认界面.今天同事的电脑用ArcMap打开数据后,移动或缩放数据时莫名的闪动. 于是使用排除法来查找原因:(1)先以为是数据的原因,换个数据还是有问题:(2)后以 ...
- oracle10g 统计信息查看、收集
1. 统计信息查看 1.1 单个表的全局统计信息.统计效果查看 2. 统计信息分析(收集) 2.1 分析工具选择 2.2 分析前做index重建 2.3 分析某数据表,可以在PL/SQL的comm ...
- oracle断电重启之ORA-00600[4194]
1.问题描述 Oracle服务器断电重启以后无法数据库无法正常连接,使用sqlplus envision/envision连接报错.常见的错误有以下这些: ORA-12518: TNS:listene ...
- 去掉 Android工程中让人很不爽的“黄色警告”
一:问题 二:解决方法 (1)选择android工程,右键Android Tools —> Clear Lint Markers 这种方式能够清除android工程里面的所有警告信息 ...
- i++是否原子操作
i++是否原子操作 不是原子操作.理由: 1.i++分为三个阶段: 内存到寄存器 寄存器自增 回内存 这三个阶段中间都可以被中断分离开. 2.++i首先要看编译器是怎么编译的, 某些编译器比如VC在 ...
- java多线程系列6-阻塞队列
这篇文章将使用经典的生产者消费者的例子来进一步巩固java多线程通信,介绍使用阻塞队列来简化程序 下面是一个经典的生产者消费者的例子: 假设使用缓冲区存储整数,缓冲区的大小是受限制的.缓冲区提供wri ...
- iOS 简单工厂模式
iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
- 我对XCode Objective-c Cocoa的简单理解
我对XCode Objective-c Cocoa的简单理解 Xcode Xcode说的通俗一点就是开发OS X 和 iOS 应用程序的. 如果我们想要认真点说 ,Xcode 是运行在操作系统Mac ...