【NOI2022省选挑战赛 Contest3 A】矩阵(KM算法)

矩阵

题目链接:NOI2022省选挑战赛 Contest3 A

题目大意

给你一个 n*n 的矩阵 A,然后要你构造一个矩阵 B 使得对于每个位置 B 的值都不小于 A 的,并且 B 满足 Bi+1,j+1+Bi,j=Bi+1,j+Bi,j+1

思路

考虑移项:Bi+1,j+1=Bi,j+1+Bi+1,jBi,j
然后它每次就可以弄成一个阶梯状,然后依次是 1,1,1,1,1
然后你每次再把中间的 1 点掉,你会发现把会变成一个只有三个 1,而且三个 1 构成等腰三角形的感觉。

然后我们考虑把它移动到直角的点在 (0,0),然后我们设 B0,0=0,那我们就是要构造 Bi,0,B0,i,使得 Bi,0+B0,jBi,j 且最小化所有 Bi,j 的和。

你会想到什么?KM算法!
然后你直接上跑最大权完美匹配就好了。

代码

#include<cstdio> #include<cstring> #include<iostream> #define INF 0x3f3f3f3f3f3f3f3f using namespace std; int n, m, a[51][51], pre[51]; int ex[51], ey[51], matched[51], slack[51]; bool iny[51]; void match(int now) { memset(iny, 0, sizeof(iny)); memset(pre, 0, sizeof(pre)); for (int i = 1; i <= n; i++) slack[i] = INF; int x, y = 0, ty = 0; matched[y] = now; while (1) { x = matched[y]; iny[y] = 1; int d = INF; for (int i = 1; i <= n; i++) { if (iny[i]) continue; if (slack[i] > ex[x] + ey[i] - a[x][i]) { slack[i] = ex[x] + ey[i] - a[x][i]; pre[i] = y; } if (slack[i] < d) { d = slack[i]; ty = i; } } for (int i = 0; i <= n; i++) { if (iny[i]) ex[matched[i]] -= d, ey[i] += d; else slack[i] -= d; } y = ty; if (!matched[y]) break; } while (y) { matched[y] = matched[pre[y]]; y = pre[y]; } } int KM() { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) ex[i] = max(ex[i], a[i][j]); for (int i = 1; i <= n; i++) { match(i); } int re = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) re += ex[i] + ey[j]; return re; } int main() { scanf("%d %d", &n, &m); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]); printf("%d\n", KM()); if (!m) return 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%d ", ex[i] + ey[j]); } printf("\n"); } return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/15944692.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2021-02-28 【ybt高效进阶3-4-4】恒星的亮度
点击右上角即可分享
微信分享提示