KM(n^4)模板
2016-02-14 17:36
281 查看
#include<stdio.h> const int maxn=301; int lx[maxn],ly[maxn],a[maxn][maxn],vx[maxn],vy[maxn],match[maxn],n; bool dfs(int x){ vx[x]=1; for(int i=1;i<=n;i++) if(!vy[i] && lx[x]+ly[i]==a[x][i]){ vy[i]=1; if(!match[i] || dfs(match[i])){ match[i]=x; return 1; } } return 0; } int main(){ int i,j,k,m; scanf("%d",&n); for(i=1;i<=n;i++){ int max=0; for(j=1;j<=n;j++){ scanf("%d",&a[i][j]); max=max>a[i][j]?max:a[i][j]; } lx[i]=max; } for(i=1;i<=n;i++){ while(1){ for(j=1;j<=n;j++){vx[j]=0;vy[j]=0;} if(dfs(i))break; int min=100000000; for(j=1;j<=n;j++) if(vx[j]) for(k=1;k<=n;k++) if(!vy[j]) min=min>(lx[j]+ly[k]-a[j][k])?min:lx[j]+ly[k]-a[j][k]; if(min==100000000){ printf("-1\n"); return 0; } for(j=1;j<=n;j++) if(vx[j])lx[j]-=min; for(j=1;j<=n;j++) if(vy[j])ly[j]+=min; } } int ans=0; for(i=1;i<=n;i++)ans+=a[match[i]][i]; printf("%d\n",ans); return 0; }
相关文章推荐
- 栈
- http://blog.csdn.net/chenli522/article/details/17001823
- 从点到面,给Button的属性动画
- iOS IM开发准备工作(一)XML解析
- rocketmq3.26研究之Failover下producer的表现
- iOS开发笔记-圆滑的曲线
- 从字符数组中删除字符
- 条件变量
- HA 高可用集群
- 序列化和反序列化
- Eclipse快捷键1
- 利用SVN的post-commit钩子实现多项目自动同步
- iOS字符串处理详解
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
- sublime text3
- 设计模式-工厂
- MATLAB插值方法简介
- c++基础——类的大小
- 打印杨辉三角
- log4j.properties配置文件详解