题目大意

给你一个\(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;
}

最新文章

  1. Zabbix 3.0 安装笔记
  2. [问题2014A10] 解答
  3. 用Handler图片轮播练习
  4. 微信开放平台API开发资料
  5. python+webdriver ppt
  6. awesome-very-deep-learning
  7. wordpress可视化编辑器的开启/关闭
  8. [改善Java代码]asList方法产生的List对象不可更改
  9. direct3D directX
  10. sphinx(coreseek)——1、增量索引
  11. nodejs调试
  12. java jdk缓存-128~127的Long与Integer
  13. vue2项目使用axios发送请求
  14. 有史以来功能最全,使用最简单的excel导入/导出工具
  15. 机器学习算法GBDT
  16. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
  17. instanceof 操作符实现原理解析
  18. CodeVs 1009
  19. “京东金融”主页效果 RecyclerView联动
  20. c++以代理的方式来实现接口化编程

热门文章

  1. 8.ffmpeg-基础常用知识
  2. 15个随机图片API
  3. Priest John&#39;s Busiest Day(POJ 3683)
  4. Python中的相对路径的表示方法
  5. redis之哨兵部署运行日志解读
  6. 使用PyCharm引入需要使用的包
  7. jfinal3连接sqlserver2012 使用generator生成model 将smallint默认为string
  8. 微服务实战系列(四)-注册中心springcloud alibaba nacos
  9. 听我的,看完这30道MySQL基础题再去面试
  10. 和低效 IO 说再见,回头补一波 Java 7 的 NIO.2 特性