参见这里

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, a[305][305], mat[305], exu[305], exv[305], qiw[305];
const int oo=0x3f3f3f3f;
bool viu[305], viv[305];
bool dfs(int x){
viu[x] = true;
for(int i=1; i<=n; i++){
if(viv[i]) continue;
int gap=exu[x]+exv[i]-a[x][i];
if(!gap){
viv[i] = true;
if(!mat[i] || dfs(mat[i])){
mat[i] = x;
return true;
}
}
else qiw[i] = min(qiw[i], gap);
}
return false;
}
int main(){
while(scanf("%d", &n)!=EOF){
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d", &a[i][j]);
memset(mat, 0, sizeof(mat));
memset(exu, 0, sizeof(exu));
memset(exv, 0, sizeof(exv));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
exu[i] = max(exu[i], a[i][j]);
for(int i=1; i<=n; i++){
memset(qiw, 0x3f, sizeof(qiw));
while(true){
memset(viu, 0, sizeof(viu));
memset(viv, 0, sizeof(viv));
if(dfs(i)) break;
int tmp=oo;
for(int j=1; j<=n; j++)
if(!viv[j])
tmp = min(tmp, qiw[j]);
for(int j=1; j<=n; j++){
if(viu[j]) exu[j] -= tmp;
if(viv[j]) exv[j] += tmp;
else qiw[j] -= tmp;
}
}
}
int ans=0;
for(int i=1; i<=n; i++)
ans += a[mat[i]][i];
printf("%d\n", ans);
}
return 0;
}

最新文章

  1. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解
  2. 【原】react-router项目实战
  3. HDOJ -- 1015
  4. Linux网络配置相关
  5. Tomcat 内存设置
  6. unity多边形uv地图
  7. 【快速入门ORM框架之Dapper】大牛勿进系列
  8. Linux高级指令
  9. easyUI 学习
  10. Luogu P4484 [BJWC2018]最长上升子序列
  11. [WebRTC/JsSIP] AUDIO RTP REPORTS ERROR: [Remote Address Error!]
  12. java框架之SpringBoot(6)-Restful风格的CRUD示例
  13. 注册Activity
  14. 设置UniDbGrid的整行显示颜色,如果某字段值是我们的控制字段
  15. Codeforces.528D.Fuzzy Search(FFT)
  16. 牛客小白月赛7 B 自杀游戏
  17. h5解决移动端上滑卡顿问题
  18. jssip中文开发文档(完整版)
  19. Carbon中文使用手册
  20. 有效提升大数据量写入excel的效率

热门文章

  1. 17997 Simple Counting 数学
  2. setTimeout的核心原理和巧用
  3. 一步步实现自己的ORM(四)
  4. 动画 iOS基础
  5. 【数据分析 R语言实战】学习笔记 第八章 方差分析与R实现
  6. Linux if 命令判断条件总结
  7. JavaScript_1_简介
  8. 百度影棒安装apk方法
  9. hadoop中修改端口号
  10. 解决response在controller返回乱码的解决方式