题目

给定 \(n*n\) 的矩阵,现在给每行安排一个权值 \(x_i\),给每列安排一个权值 \(y_j\),

使得 \(x_i+y_j\geq a_{i,j}\),并且使 \(\sum_{i=1}^nx_i+y_i\) 最小。


分析

学过KM算法的话,就应该知道可以将 \(x_i\) 和 \(y_i\) 当成顶标,并且当 \(x_i+y_j=a_{i,j}\) 时取得最小值,

那么就转换成二分图最大权匹配,直接跑KM算法将匹配的边权和加起来就是答案。


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <queue>
using namespace std;
const int N=511;
bool vx[N],vy[N]; queue<int>q;
int slack[N],lx[N],ly[N],G[N][N];
int px[N],py[N],link[N],n,ans;
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int min(int a,int b){return a<b?a:b;}
int max(int a,int b){return a>b?a:b;}
void adjust(int y){
for (int _y;y;y=_y){
_y=px[link[y]];
px[link[y]]=y;
py[y]=link[y];
}
}
void bfs(int st){
for (int i=1;i<=n;++i) slack[i]=0x3f3f3f3f,vx[i]=vy[i]=0;
while (!q.empty()) q.pop();
q.push(st);
while (1){
while (!q.empty()){
int x=q.front();
vx[x]=1,q.pop();
for (int y=1;y<=n;++y)
if (!vy[y]&&slack[y]>lx[x]+ly[y]-G[x][y]){
slack[y]=lx[x]+ly[y]-G[x][y],link[y]=x;
if (!slack[y]){
vy[y]=1;
if (!py[y]) {adjust(y); return;}
else q.push(py[y]);
}
}
}
int mn=0x3f3f3f3f;
for (int i=1;i<=n;++i)
if (!vy[i]) mn=min(mn,slack[i]);
for (int i=1;i<=n;++i){
if (vx[i]) lx[i]-=mn;
if (vy[i]) ly[i]+=mn;
else slack[i]-=mn;
}
for (int i=1;i<=n;++i)
if (!vy[i]&&!slack[i]){
vy[i]=1;
if (!py[i]) {adjust(i); return;}
else q.push(py[i]);
}
}
}
void KM(){
for (int i=1;i<=n;++i){
link[i]=ly[i]=px[i]=py[i]=0,lx[i]=-0x3f3f3f3f;
for (int j=1;j<=n;++j)
lx[i]=max(lx[i],G[i][j]);
}
for (int i=1;i<=n;++i) bfs(i);
}
int main(){
while (scanf("%d",&n)==1){
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j) G[i][j]=iut();
KM(),ans=0;
for (int i=1;i<=n;++i) ans+=lx[i],ans+=ly[i];
for (int i=1;i<=n;++i) print(lx[i]),putchar(i==n?10:32);
for (int i=1;i<=n;++i) print(ly[i]),putchar(i==n?10:32);
print(ans),putchar(10);
}
return 0;
}

#KM算法#UVA11383 Golden Tiger Claw的更多相关文章

  1. uva11383 Golden Tiger Claw 深入理解km算法

    /** 题目: uva11383 Golden Tiger Claw 深入理解km算法 链接:https://vjudge.net/problem/UVA-11383 题意:lv 思路:lrj训练指南 ...

  2. UVA11383 Golden Tiger Claw

    题目 UVA11383 Golden Tiger Claw 做法 \(KM\)好题啊,满足所有边\(l(x)+l(y)≥w(x,y)\)(个人理解,如不对请及时留言),这样能满足\(\sum\limi ...

  3. UVA11383 Golden Tiger Claw —— KM算法

    题目链接:https://vjudge.net/problem/UVA-11383 题解: 根据KM()算法,标杆满足:l(x) + l(y) >= w(x, y) . 当求完最大权匹配之后,所 ...

  4. UVA-11383 Golden Tiger Claw (KM算法)

    题目大意:一张可行二分图的权值以邻接矩阵的形式给了出来,现在要找每一个节点的可行顶标,使顶标和最小. 题目分析:直接用KM算法,结束后顶标之和最小...模板题. 代码如下: # include< ...

  5. UVA11383 Golden Tiger Claw KM算法

    题目链接:传送门 分析 这道题乍看上去没有思路,但是我们仔细一想就会发现这道题其实是一个二分图最大匹配的板子 我们可以把这道题想象成将男生和女生之间两两配对,使他们的好感度最大 我们把矩阵中的元素\( ...

  6. 【UVA 11383】 Golden Tiger Claw (KM算法副产物)

    Omi, Raymondo, Clay and Kimiko are on new adventure- in search of new Shen Gong Wu. But EvilBoy Geni ...

  7. UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)

    UVA 11383 - Golden Tiger Claw 题目链接 题意:给定每列和每行的和,给定一个矩阵,要求每一个格子(x, y)的值小于row(i) + col(j),求一种方案,而且全部行列 ...

  8. Golden Tiger Claw(二分图)

    Golden Tiger Claw 题意 找到和最小的两个序列a,b满足对于任意i,j有a[i]+b[j]>=c[i][j](矩阵c给出). solution 裸的二分图就水过了-- #incl ...

  9. UVA 11383 Golden Tiger Claw 金虎爪(KM算法)

    题意: 给一个n*n的矩阵,每个格子中有正整数w[i][j],试为每行和每列分别确定一个数字row[i]和col[i],使得任意格子w[i][j]<=row[i]+col[j]恒成立.先输row ...

  10. 【KM算法】UVA 11383 Golden Tiger Claw

    题目大意 给你一个\(n×n\)的矩阵G,每个位置有一个权,求两个一维数组\(row\)和\(col\),使\(row[i] + col[j]\ge G[i][j]\),并且\(∑row+∑col\) ...

随机推荐

  1. XXL-Job框架入门介绍

    框架概述 框架主页: https://www.xuxueli.com/xxl-job/ 包含组件: 1.调度中心 2.任务执行器 特点: 1.调度中心,任务执行器独立部署,互不影响. 2.调度中心和任 ...

  2. CentOS8安装Geant4笔记(二):CentOS8安装Qt5.15.2并测试运行环境

    前言   在服务器CentOs8.2上安装geant4软件,但是运行不起来,所以本节开始主要是安装qt,测试qt基本功能.   要点   添加qt环境到系统环境中,是geant4启动qt的必要条件. ...

  3. 参数替换xargs

    由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔为参数 示例: 创建10个用户 echo user{ ...

  4. heapq.merge()高效合并有序序列

    import heapq import random # 针对较大的数据集,采用heapq中的merge()方法 # merge()不是对整个合并后的序列排序,而是使用一个堆一次一个元素的生成一个新序 ...

  5. vue upload 图片转base64、转二进制数组,保存编码数据到文件

    功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...

  6. tomcat启动错误“The temporary upload location”

    目录 问题的原因 解决方案 临时的,直接重新启动项目就行,会重新建立临时文件夹 在配置文件中配置tomcat的临时目录: 写个配置类,通过@Bean的方式配置目录: 问题的原因 在Linux 系统中, ...

  7. 【Azure 云服务】当Windows系统发布新的安全漏洞后,如何查看Azure云服务(Cloud Service)的实例是否也更新了安全补丁呢?

    问题描述 当Windows发布新的安全漏洞后,会根据安全漏洞的级别分类来确定是紧急打补丁升级,还是每一月的补丁日( 每月第二周的星期二)来统一推送补丁. 比如最近的一个安全漏洞(9月13号发布)  C ...

  8. 【Azure Developer】使用 Azure Python 查看 Azure 所有的 Alert rule

    问题描述 在Azure Alert 门户中,可以列举出所有Azure资源的Alert rule信息,如下图: 如果像通过Python SDK来获取所有的Alert Rule,有什么可以参考的代码吗? ...

  9. 【Azure Developer】使用 Azure VM 上的用户分配托管标识访问 Azure Key Vault 中国区代码示例

    问题描述 在Global版本的Azure Key Vault 文档中,有一节介绍在Azure VM中使用标识获取访问令牌,调用Key Vault中的资源.但是在示例中,只有curl的命令执行,而没有代 ...

  10. 【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known

    问题描述 使用 azure-spring-boot-starter-storage 来上传文件到 Storage Blob中,并把应用部署到Azure 中国区的Spring Cloud服务后,调用上传 ...