KM算法是在匹配是完备的情况下寻找最优匹配。

首先,先将范围定为最大的情况,如果最大的情况无法满足,就下降一个维度继续匹配。

直到匹配成功。

 #include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=3e2+;
const int inf=0x3f3f3f3f;
int G[maxn][maxn],n;
int lx[maxn],ly[maxn];
int match[maxn];
int visx[maxn],visy[maxn];
void init()
{
memset(match,,sizeof(match));
}
int dfs(int k)
{
visx[k]=;
for(int i=;i<=n;i++){
if(!visy[i]&&G[k][i]==lx[k]+ly[i]){
visy[i]=;
if(!match[i]||dfs(match[i])){
match[i]=k;
return ;
}
}
}
return ;
}
int KM()
{
for(int i=;i<=n;i++){
lx[i]=-inf,ly[i]=;
for(int j=;j<=n;j++)
lx[i]=max(lx[i],G[i][j]);
}
for(int k=;k<=n;k++){
while(){
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(dfs(k)) break;
int mn=inf; for(int i=;i<=n;i++) if(visx[i])
for(int j=;j<=n;j++) if(!visy[j])
mn=min(mn,lx[i]+ly[j]-G[i][j]);
if(mn==inf) return -;
for(int i=;i<=n;i++) if(visx[i]) lx[i]-=mn;
for(int i=;i<=n;i++) if(visy[i]) ly[i]+=mn;
}
}
int ans=;
for(int i=;i<=n;i++) if(match[i])
ans+=G[match[i]][i];
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF){
init();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&G[i][j]);
printf("%d\n",KM());
}
return ;
}

最新文章

  1. Win10提示没有权限使用网络资源问题解决
  2. 借助亚马逊S3和RapidMiner将机器学习应用到文本挖掘
  3. floyd算法学习笔记
  4. Asp.Net运行于32/64模式下的性能差异
  5. hdu2457
  6. 文件快速搜索工具-Everything的使用(转)
  7. 有图有真相——关于“视频专辑:零基础学习C语言 ”
  8. java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
  9. Spring框架学习之第9节
  10. NCPC 2012 Galactic Warlords
  11. 在多台服务器上简单实现Redis的数据主从复制
  12. JavaScript闭包的一些理解
  13. w3school之CSS学习笔记
  14. Codeforces.618F.Double Knapsack(构造 鸽巢原理)
  15. Android 判定手机是否root
  16. VS2010插件 VS.PHP 调试开发php程序
  17. No.1101_第十次团队会议
  18. yolo-v2只识别person
  19. 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
  20. Macbook pro睡眠状态恢复后没声音的解决办法

热门文章

  1. 流量难、获客难、增长难?增长黑客思维“解救”B端业务
  2. yum装包报错
  3. jmeter请求报错
  4. MySQL8.0.11解压版安装详细教程
  5. 让Surface Shader不受光照的明暗影响
  6. webpack 之使用vue
  7. 风变编程笔记(二)-Python爬虫精进
  8. EF中的持久化场景
  9. jsp连接数据库增删改查
  10. java基础(四)之this的使用