hdu 2255 奔小康赚大钱 二分权值最大匹配
2015-11-22 21:27
267 查看
[code]#include<stdio.h> #include<string.h> #include<queue> #include<vector> using namespace std; const int N=1024; const int inf=100000000; int n,m,w ,aug,mat ,lx ,ly ; int visx ,visy ,slack ; int dfs(int u) { visx[u]=1; for(int v=1;v<=m;v++) { int t=lx[u]+ly[v]-w[u][v]; if(t) slack[v]=min(slack[v],t); else { if(!visy[v]) { visy[v]=1; if(mat[v]==-1||dfs(mat[v])) { mat[v]=u; return 1; } } } } return 0; } int km() { int i,j,ret=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) lx[i]=max(lx[i],w[i][j]); for(int x=1;x<=n;x++) { for(i=0;i<=m;i++) slack[i]=inf; while(1) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(dfs(x)) break; aug=inf; for(i=1;i<=m;i++) if(!visy[i]) aug=min(aug,slack[i]); for(i=1;i<=n;i++) if(visx[i]) lx[i]-=aug; for(i=1;i<=m;i++) if(visy[i]) ly[i]+=aug; else slack[i]-=aug; } } int cnt=0; for(i=1;i<=m;i++) { if(mat[i]==-1||w[mat[i]][i]==-inf) continue; cnt++; ret+=w[mat[i]][i]; } if(cnt!=n) return -1; return ret; } void init() { memset(mat,-1,sizeof(mat)); memset(lx,-0x7f,sizeof(lx)); memset(ly,0,sizeof(ly)); memset(w,-0x7f,sizeof(w)); } int main() { int i,j; while(~scanf("%d",&n)) { init(); m=n; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&w[i][j]); } } printf("%d\n",km()); } }
相关文章推荐
- yii2 ListView 中的 样式修改
- struts2拦截器的故事
- iOS AFNetworking
- 单例模式(创建型)
- hiho刷题日记——第十八天RMQ问题再临
- 信息安全系统设计基础第十一周学习总结
- 解决地址栏传值乱码问题
- lintcode 最长上升连续子序列 II(二维最长上升连续序列)
- VRRP详解
- 适配器模式(结构型)
- java内部类
- rrdtool 实践
- 搞对象前,你得先有对象
- 数据库 大数据
- XHTML与CSS一些基本语法与编写习惯
- spring的依赖注入是什么意思
- Android之drawable state各个属性详解
- 第十一天-linux的硬链接和软连接的区别
- Android Resource Types之Menu简介
- ThoughtWorks(中国)程序员读书雷达