KM算法板子2
2015-08-21 19:28
369 查看
//HDU2426
//
//
#include <iostream> #include<stdio.h> #include<string.h> #include<string> using namespace std; const int maxn=550; int visx[maxn],visy[maxn]; int link[maxn]; int lx[maxn],ly[maxn]; int w[maxn][maxn]; int slack[maxn]; int link1[maxn]; int n,m; const int inf=999999999; int find(int x) { visx[x]=1; for(int i=0;i<m;i++) { if(w[x][i]==inf||visy[i]) continue; int t=lx[x]+ly[i]-w[x][i]; if(t==0) { visy[i]=1; if(link[i]==-1||find(link[i])) { link[i]=x; link1[x]=i; return 1; } } else { if(slack[i]>t) slack[i]=t; } } return 0; } int sk() { memset(link,-1,sizeof(link)); memset(link1,-1,sizeof(link1)); memset(ly,0,sizeof(ly)); for(int i=0;i<n;i++) { lx[i]=-inf; for(int j=0;j<m;j++) { if(w[i][j]!=inf) lx[i]=max(lx[i],w[i][j]); } } for(int i=0;i<n;i++) { //cout<<"m:"<<i<<endl; for(int j=0;j<m;j++) slack[j]=inf; while(true) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(find(i)) break; // cout<<"sb"<<endl; int d=inf; for(int j=0;j<m;j++) { if(!visy[j]&&d>slack[j]) d=slack[j]; } if(d==inf) return -1; for(int j=0;j<n;j++) { if(visx[j]) lx[j]-=d; } for(int j=0;j<m;j++) { if(visy[j]) ly[j]+=d; else { slack[j]-=d; } } } } int ans=0; int flag=0; for(int i=0;i<n;i++) { if(link1[i]==-1) { flag=1; break; } else { ans+=w[i][link1[i]]; // cout<<"ans"<<ans<<endl; } } if(flag) ans=-1; return ans; } int main() { int e; int tot=1; while(scanf("%d%d%d",&n,&m,&e)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) w[i][j]=inf; } for(int i=1;i<=e;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(c>=0) { w[a][b]=c; // w[a][b]=c; } } printf("Case %d: %d\n",tot++,sk()); } return 0; }
相关文章推荐
- 简单封装的httpclient
- MySQL 调优/优化的 100 个建议
- ios开发学习--歌词处理--解析lrc文件
- 前向声明 前置声明 Forward Declare
- iOS将数组中的内容分拼接成字符串
- HDU 5410 CRB and His Birthday(01背包+完全背包)
- 二叉树遍历求差值绝对值最大值
- C++中虚函数与晚绑定的编译器实现
- 访问者模式
- zoj 3878 Convert QWERTY to Dvorak【好坑的模拟】
- zoj3878Convert QWERTY to Dvorak(打表)
- 卡尔曼滤波应用与讲解(x未完成x)
- windows编程之剪切板
- 一个可以即插即用的MD5加密签名方式
- 文件扩展名批量修改器
- 程序员的生活充满压力,但你不能放弃!
- fzu 2135 数字游戏 【水题】
- Convert QWERTY to Dvorak (字符串)
- ubuntu15.04安装chrome
- C 头文件之<ctpye.h>