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