HDU_2255 二分图最佳完美匹配 KM匈牙利算法
2024-09-07 16:33:33
一开始还没看懂这个算法,后来看了陶叔去年的PPT的实例演示才弄懂
用一个lx[]和ly[]来记录X和Y集合中点的权值,有个定理是 lx[i]+ly[j]==w[i][j](边权值) 则该点是最佳匹配,因为首先 那个不等式肯定要>=的,否则就不满足题意了,如果是>则可以去匹配更有价值的边或者把权值降下来让匹配边的潜力更大。
所以只有把握了这个条件,其他就是走一遍最大匹配数。以及up()函数用来在无法匹配的时候,进行其他点的权值降低(也可以说是增广路的搜索)来得到匹配。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 310
using namespace std;
int w[N][N],n,lx[N],ly[N],lefts[N];
bool S[N],T[N];
bool dfs(int u)
{
S[u]=;
for (int v=;v<=n;v++)
if (lx[u]+ly[v]==w[u][v] && !T[v]){
T[v]=true;
if (!lefts[v] || dfs(lefts[v])){
lefts[v]=u;
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;
}
}
void KM()
{
int i,j;
for (i=;i<=n;i++){
lefts[i]=lx[i]=ly[i]=;
for (j=;j<=n;j++){
lx[i]=max(lx[i],w[i][j]);
}
}
for (i=;i<=n;i++){
for (;;){
memset(S,,sizeof S);
memset(T,,sizeof T);
if (dfs(i)) break;
else update();
}
}
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i=;i<=n;i++)
for (int j=;j<=n;j++) scanf("%d",&w[i][j]);
memset(lefts,-,sizeof lefts);
KM();
int ans=;
for (int i=;i<=n;i++){
ans+=lx[i];
ans+=ly[i];
}
printf("%d\n",ans);
}
return ;
}
最新文章
- CommonJS, AMD 和 RequireJS之间的关系(转载)
- oracle安装常见问题
- 【原】error C2679: binary &#39;<;<;&#39; : no operator found which takes a right-hand operand of type &#39;std::string&#39;
- scikit-learn——快速入门
- Redis基础知识之————php-Redis 常用命令专题
- postgreSQL环境搭建
- OpenJudge计算概论-分配病房
- Windows 下 玩转Node.JS
- httpsClient实例
- JMX学习笔记(二)-Notification
- Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)
- 开发DZ插件教程
- [Leetcode][Python]32: Longest Valid Parentheses
- 解决XCode插件在XCode6.4上失效的办法
- IOS中单例NSUserDefaults的使用(转)
- Oracle listener服务启动后又停止的解决方案
- SQL Server 实现递归查询
- UNIX网络编程——客户/服务器程序设计示范(一)
- 【朝花夕拾】Android性能篇之(二)Java内存分配
- MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)
热门文章
- Unity添加小米游戏SDK
- Mysql8.0免安装包配置方法
- Arm-Linux 移植 Ubuntu
- Windows 10工程版本泄露全新设计的操作中心圆角样式
- vs2010编译C++ 栈的使用
- Unbutu下装oracle
- define可变参数,float数据传输
- springboot启动报错:Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type &#39;com.zxkj.lockserver.dao.CompanyDao&#39; available: expected at least 1 bean which qua
- 8 Jvm堆分析
- 构造方法与setter方法