一开始还没看懂这个算法,后来看了陶叔去年的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 ;
}

最新文章

  1. CommonJS, AMD 和 RequireJS之间的关系(转载)
  2. oracle安装常见问题
  3. 【原】error C2679: binary &#39;&lt;&lt;&#39; : no operator found which takes a right-hand operand of type &#39;std::string&#39;
  4. scikit-learn——快速入门
  5. Redis基础知识之————php-Redis 常用命令专题
  6. postgreSQL环境搭建
  7. OpenJudge计算概论-分配病房
  8. Windows 下 玩转Node.JS
  9. httpsClient实例
  10. JMX学习笔记(二)-Notification
  11. Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)
  12. 开发DZ插件教程
  13. [Leetcode][Python]32: Longest Valid Parentheses
  14. 解决XCode插件在XCode6.4上失效的办法
  15. IOS中单例NSUserDefaults的使用(转)
  16. Oracle listener服务启动后又停止的解决方案
  17. SQL Server 实现递归查询
  18. UNIX网络编程——客户/服务器程序设计示范(一)
  19. 【朝花夕拾】Android性能篇之(二)Java内存分配
  20. MySql cmd下的学习笔记 —— 有关建立表的操作(有关于数据类型)

热门文章

  1. Unity添加小米游戏SDK
  2. Mysql8.0免安装包配置方法
  3. Arm-Linux 移植 Ubuntu
  4. Windows 10工程版本泄露全新设计的操作中心圆角样式
  5. vs2010编译C++ 栈的使用
  6. Unbutu下装oracle
  7. define可变参数,float数据传输
  8. 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
  9. 8 Jvm堆分析
  10. 构造方法与setter方法