题目

给定 \(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. Frida 原理

    frida注入的主要思路: 1.找到目标进程,使用ptrace跟踪目标进程 2.获取mmap,dlpoen,dlsym等函数库的偏移 3.获取mmap,在目标进程申请一段内存空间,将在目标进程中找到存 ...

  2. django学习第十天---ajax请求和JsonResponse

    AJAX 它是js的功能,特点:异步请求,局部刷新 简单请求示例 基于jquery的ajax请求 异步请求,不会刷新页面,页面上用户之前输入的数据都不会丢失 <p>下面是ajax请求< ...

  3. error接口

    // 实际上它是interface类型,这个类型有一个返回错误信息的单一方法: type error interface{ Error() string } 创建一个error最简单的方法就是调用er ...

  4. JS笔记:方法两次调用,执行不同分支(公共变量,闭包,类三种方法实现)

    好家伙,   当我们对一个方法进行两次调用,我们希望第一次执行A分支,第二次执行B分支,该怎么做? 这意味着在连续的两次调用中,方法的执行逻辑会交替执行不同的分支. 方法一:公共变量 let flag ...

  5. 第121篇: DOM常用类型(Document、Element)

    好家伙,本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记   1.Document类型 Document 类型是 JavaScript 中表示文档节点的类型. ...

  6. 【Azure 微服务】Service fabric升级结构版本失败问题

    问题描述 Service fabric升级结构版本失败,Service Fabric的可靠性层是白银层,持久性层为青铜层,当把节点从6个直接在虚拟规模集(VMSS)中缩放成了3个.从而引起了Servi ...

  7. Java 对属性赋值的位置 执行的先后顺序

    1 package com.bytezreo.block; 2 3 /** 4 * 5 * @Description 对属性赋值的位置: 6 * @author Bytezero·zhenglei! ...

  8. Python(上机题) 通俗易懂的基础题目解析

    python 题目 文章目录 python 题目 题目一:幸运数对 题目二:lambda 函数找最大值 题目三:n个数前后互换 (切片) 题目四:字符串相减(删除指定字符) 方法一:可以用空字符来替换 ...

  9. 在本地搭建 SVN 教程

    SVN 使用教程 以下内容参考自:SVN使用详细教程_大梦谁先觉i的博客-CSDN博客_svn使用教程 一.SVN 安装 1.1 软件下载 服务器:Downloads | VisualSVN 客户端: ...

  10. Apollo获取配置异常:Load config failed, will retry in 1 SECONDS

    一.现象 apollo开启秘钥,服务获取配置参数需要启动参数中添加:jvm参数-Dapollo.accesskey.secret=XXX.日志如下: 二.解决方案 应用服务器时间异常,重置应用服务器时 ...