【KM算法】UVA 11383 Golden Tiger Claw
2024-09-06 18:06:30
题目大意
给你一个\(n×n\)的矩阵G,每个位置有一个权,求两个一维数组\(row\)和\(col\),使\(row[i] + col[j]\ge G[i][j]\),并且\(∑row+∑col\)最小,输出这个和。
样例输入
2
1 1
1 1
数据范围
\(0\le N\le 500\)
样例输出
1 1
0 0
2
思路
题面花里胡哨,其实就是二分图带权匹配,求的数组其实就是KM算法里的顶标。就是模板啊!这也太水了。
代码
#include <cstdio>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=500+10;
int n;
int g[maxn][maxn];
int match[maxn],wx[maxn],wy[maxn],slack[maxn];
bool visx[maxn],visy[maxn];
bool dfs(int u){
visx[u]=true;
for(int v=1;v<=n;v++){
if(!visy[v]){
int t=wx[u]+wy[v]-g[u][v];
if(t==0){
visy[v]=true;
if(match[v]==-1||dfs(match[v])){
match[v]=u;
return true;
}
}
else if(slack[v]>t)slack[v]=t;
}
}
return false;
}
int KM(){
memset(match,-1,sizeof(match));
memset(wx,0,sizeof(wx));
memset(wy,0,sizeof(wy));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]>wx[i])wx[i]=g[i][j];
}
}
for(int x=1;x<=n;x++){
for(int i=1;i<=n;i++)
slack[i]=INF;
while(1){
memset(visx,false,sizeof(visx));
memset(visy,false,sizeof(visy));
if(dfs(x))break;
int minz=INF;
for(int i=1;i<=n;i++)
if(!visy[i]&&minz>slack[i])
minz=slack[i];
for(int i=1;i<=n;i++)
if(visx[i])wx[i]-=minz;
for(int i=1;i<=n;i++){
if(visy[i])wy[i]+=minz;
else slack[i]-=minz;
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans+=wx[i]+wy[i];
return ans;
}
int main(){
while(~scanf("%d",&n)){
memset(g,0,sizeof(g));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&g[i][j]);
}
}
int ans=KM();
printf("%d",wx[1]);
for(int i=2;i<=n;i++)
printf(" %d",wx[i]);
printf("\n");
printf("%d",wy[1]);
for(int i=2;i<=n;i++)
printf(" %d",wy[i]);
printf("\n");
printf("%d\n",ans);
}
return 0;
}
最新文章
- Zabbix 3.0 安装笔记
- [问题2014A10] 解答
- 用Handler图片轮播练习
- 微信开放平台API开发资料
- python+webdriver ppt
- awesome-very-deep-learning
- wordpress可视化编辑器的开启/关闭
- [改善Java代码]asList方法产生的List对象不可更改
- direct3D directX
- sphinx(coreseek)——1、增量索引
- nodejs调试
- java jdk缓存-128~127的Long与Integer
- vue2项目使用axios发送请求
- 有史以来功能最全,使用最简单的excel导入/导出工具
- 机器学习算法GBDT
- POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
- instanceof 操作符实现原理解析
- CodeVs 1009
- “京东金融”主页效果 RecyclerView联动
- c++以代理的方式来实现接口化编程
热门文章
- 8.ffmpeg-基础常用知识
- 15个随机图片API
- Priest John&#39;s Busiest Day(POJ 3683)
- Python中的相对路径的表示方法
- redis之哨兵部署运行日志解读
- 使用PyCharm引入需要使用的包
- jfinal3连接sqlserver2012 使用generator生成model 将smallint默认为string
- 微服务实战系列(四)-注册中心springcloud alibaba nacos
- 听我的,看完这30道MySQL基础题再去面试
- 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性