博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分配问题(二部图的最佳匹配 KM) 线性规划与网络流24题
阅读量:6269 次
发布时间:2019-06-22

本文共 1781 字,大约阅读时间需要 5 分钟。

//http://www.cnblogs.com/IMGavin/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;#define gets(A) fgets(A, 1e8, stdin)const int INF = 0x3F3F3F3F, N = 108, MOD = 1003;const double EPS = 1e-6;int val[N][N];bool visx[N], visy[N];//始终有lx[x] + ly[y] >= w[x][y],且结束后顶标之和最小int lx[N], ly[N], slack[N], match[N];//match[y]表示Y集节点y对X的匹配int nx, ny;//X集Y集节点个数,要先初始化bool Hungary(int u){ visx[u] = true; for(int i = 0; i < ny; i++){ if(!visy[i]){ if(lx[u] + ly[i] == val[u][i]){ visy[i] = true; if(match[i] == -1 || Hungary(match[i])){ match[i] = u; return true; } }else{ slack[i] = min(slack[i], lx[u] + ly[i] - val[u][i]); } } } return false;}void KM(){ memset(match, -1, sizeof(match)); memset(lx, 0, sizeof(lx)); //初始化顶标 memset(ly, 0, sizeof(ly)); //ly[i]为0 //lx[i]为权值最大的边 for(int i = 0; i < nx; i++){ for(int j = 0; j < ny; j++){ lx[i] = max(lx[i], val[i][j]); } } for(int i = 0; i < nx; i++){ for(int j = 0; j < ny; j++){ slack[j] = INF; } while(1){ memset(visx, 0, sizeof(visx)); memset(visy, 0, sizeof(visy)); if(Hungary(i)){ break; }else{ int tp = INF; for(int j = 0; j < ny; j++){ if(!visy[j] && tp > slack[j]){ tp = slack[j]; } } for(int j = 0; j < nx; j++){ if(visx[j]){ lx[j] -= tp; } } for(int j = 0; j < ny; j++){ if(visy[j]){ ly[j] += tp; }else{ slack[j] -= tp; } } } } }}int main(){ int n; while(cin >> n){ nx = ny = n; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ scanf("%d", &val[i][j]); val[i][j] = -val[i][j]; } } KM(); int ans = 0; for(int i = 0; i < n; i++){ ans += val[match[i]][i]; } cout<<-ans<

  

转载于:https://www.cnblogs.com/IMGavin/p/6388134.html

你可能感兴趣的文章
SQL*LOADER错误总结
查看>>
SQL日志收缩
查看>>
【转】MySQL Query Cache 小结
查看>>
SVN分支和合并的简单例子
查看>>
PHP实现的封装验证码类
查看>>
Augular初探
查看>>
PHPStorm下XDebug配置
查看>>
【LeetCode】55. Jump Game
查看>>
Android应用盈利广告平台的嵌入方法详解
查看>>
Linux(CentOS6.5) 开放端口,配置防火墙
查看>>
Func与Action
查看>>
Android ViewPager 应该及技巧
查看>>
ODI KM二次开发手册
查看>>
iOS通讯录整合,兼容iOS789写法,附demo
查看>>
如何将内核静态库编译连接到驱动程序中去【转】
查看>>
GNU KHATA——开源的会计管理软件
查看>>
BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 用SPD开发SharePoint应用程序...
查看>>
Java读取文件加锁代码Demo(利用Java的NIO)
查看>>
ES6 中 Symbol.split的用法
查看>>
Golang 学习权威网站
查看>>