题目

给定 \(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. 使用go module导入本地包

    go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具. 前提 假设我们有learngo和mypackage两个 ...

  2. 【Docker】.Net Core 结合Nlog集成ELK框架(Elasticsearch , Logstash, Kibana) (五)

    之前有项目有用过ELK做过日志架构,不过是非docker形式安装的,今天来探究一下ELK的容器化技术 Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动 ...

  3. 【LeetCode贪心#03】最大子序和

    最大子序和 力扣题目链接 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 子数组 是数组中的一个连续部分. 示例 1: 输入:nums = ...

  4. You can't specify target table for update in FROM clause

    mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...

  5. Javascript之Object、Array

    Object.keys 对象的键转化为数组 Object.values 对象的属性值转化为数组 Object.assign 对象的合并   Array.from() 伪数组对象的属性值转化为数组.类似 ...

  6. Jetpack的ViewModel与LiveData总结

    本文基于SDK 29 一.ViewModel与LiveData的作用: 1.viewModel: 数据共享,屏幕旋转不丢失数据,并且在Activity与Fragment之间共享数据. 2.LiveDa ...

  7. Vue3学习(二十一)- 文档管理页面布局修改

    写在前面 按照国际惯例,要先聊下生活,吐槽一番,今天是2月14日,也是下午听老妈说,我才知道! 现在真的是对日期节日已经毫无概念可言,只知道星期几. 现在已经觉得写博客也好,学习文章也罢,和写日记一样 ...

  8. 影刀rpa:第二个项目学习心得

    教程有说到元素的关联操作,教程说自上而下的html路径,一时之间没弄清楚,索性就去看了下网页的html源码,才弄清楚到底是咋回事: 我是先选中了列表子元素的价格字段,选择两次以后就能选择到所有列表子元 ...

  9. centos7通过配置hosts.allow和hosts.deny限制登陆

    etc/hosts.allow和/etc/hosts.deny两个文件是控制远程访问设置的,通过他可以允许或者拒绝某个ip或者ip段的客户访问linux的某项服务. 我们通常只对管理员开放SSH登录, ...

  10. 5、mysql优化--索引使用情况、索引的结构

    避免索引失效 1). 全值匹配 ,对索引中所有列都指定具体值. 2). 最左前缀法则 如果索引了多列,要遵守最左前缀法则.指的是查询从索引的最左前列开始,并且不跳过索引中的列. 3). 范围查询右边的 ...