题意:

  给一个n*n的矩阵,每个格子中有正整数w[i][j],试为每行和每列分别确定一个数字row[i]和col[i],使得任意格子w[i][j]<=row[i]+col[j]恒成立。先输row,再输出col,再输出全部总和(总和应尽量小)。

思路:

  本题与匹配无关,但可以用KM算法解决。

  KM算法中的顶标就是保持了Lx[i]+ly[j]>=g[i][j]再求最大权和匹配的,但这个最大权和并没有关系。我们可以将row[i]看成一个男的,col[i]看成一个女的,这样男女的总数就相等。

  一般来说,Lx[i]或Ly[i]仅需要取该行/列中最大的那个数即可保证满足要求,但是这样太大了,可以通过调整来使得总和更小。而KM算法的过程就是一个调整的过程,每一对匹配的男女的那条边的权值就会满足等号 w[i][j]=row[i]+col[j],至少需要一个来满足等号,这样才能保证row[i]+col[j]是达到最小的,即从j列看,col[j]满足条件且最小,从i行看,row[i]满足条件且最小。这刚好与KM算法求最大权和一样。

 #include <bits/stdc++.h>
#define LL long LONG_LONG_MAX
#define INF 0x7f7f7f7f
#define LL long long
using namespace std;
const int N=; int grid[N][N], girl[N];
int Lx[N], Ly[N], slack[N];
bool S[N], T[N];
int n; bool DFS(int x)
{
S[x]=true;
for(int i=; i<=n; i++)
{
if(T[i]) continue;
int tmp=Lx[x]+Ly[i]-grid[x][i];
if(tmp==)
{
T[i]=true;
if(girl[i]== || DFS(girl[i]))
{
girl[i]=x;
return true;
}
}
else if(tmp<slack[i])
slack[i]=tmp;
}
return false;
} int KM()
{
memset(girl, , sizeof(girl));
memset(Lx, , sizeof(Lx));
memset(Ly, , sizeof(Ly));
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
Lx[i]=max(Lx[i], grid[i][j]); for(int i=; i<=n; i++) //对于每个树
{
for(int j=; j<=n; j++) slack[j]=INF;
while()
{
memset(S, , sizeof(S));
memset(T, , sizeof(T));
if( DFS(i) ) break; //找到匹配的蚂蚁 int d=INF;
for(int j=; j<=n; j++) //找最小D
{
if(!T[j] && d>slack[j])
d=slack[j];
} for(int j=; j<=n; j++) //更新树
{
if(S[j])
Lx[j]-=d;
} for(int j=; j<=n; j++) //更新蚂蚁
{
if(T[j]) Ly[j]+=d;
else slack[j]-=d;
}
}
}
int sum=;
for(int i=; i<=n; i++) sum+=Lx[i]+Ly[i];
return sum;
} int main()
{
freopen("input.txt", "r", stdin);
while(~scanf("%d",&n))
{
memset(grid, , sizeof(grid));
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
scanf("%d",&grid[i][j]); int ans=KM();
printf("%d", Lx[]);//值得注意的输出格式。
for(int i=; i<=n; i++) printf(" %d", Lx[i]);
printf("\n");
printf("%d",Ly[]);
for(int i=; i<=n; i++) printf(" %d", Ly[i]);
printf("\n");
printf("%d\n", ans);
}
return ;
}

AC代码

UVA 11383 Golden Tiger Claw 金虎爪(KM算法)的更多相关文章

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

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

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

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

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

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

  4. UVA 11383 Golden Tiger Claw 题解

    题目 --> 题解 其实就是一个KM的板子 KM算法在进行中, 需要满足两个点的顶标值之和大于等于两点之间的边权, 所以进行一次KM即可. KM之后, 顶标之和就是最小的.因为如果不是最小的,就 ...

  5. Uva - 11383 - Golden Tiger Claw

    题意:一个N*N的矩阵,第i行第j列的元素大小为w[i][j],每行求一个数row[i],每列求一个数col[j],使得row[i] + col[j] >= w[i][j],且所有的row[]与 ...

  6. UVA 11383 Golden Tiger Claw(最佳二分图完美匹配)

    题意:在一个N*N的方格中,各有一个整数w(i,j),现在要求给每行构造row(i),给每列构造col(j),使得任意w(i,j)<=row(i)+col(j),输出row(i)与col(j)之 ...

  7. 【UVA11383】 Golden Tiger Claw 【二分图KM算法(板子)】

    题目 题目传送门:https://www.luogu.com.cn/problem/UVA11383 分析 最近刚刚学了二分图,然后来了一个这样的题,看完题意之后,稍微想一想就能想出来是一个二分图,然 ...

  8. 【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 ...

  9. UVA11383 Golden Tiger Claw

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

随机推荐

  1. jmeter学习预热

    对jmeter有些兴趣,最近想抽点时间熟悉下,个人熟悉某个工具的方法: 1.官网http://jmeter.apache.org/,一般官网会有Tutorials或者Getting Started之类 ...

  2. hdu 4726 Kia's Calculation

    思路:刚开始想复杂了. 看解题报告后才知道这题挺简单的,看来还是要多训练啊!!! 单独处理首位的数字,不能为0.其他的就好处理了,从大到小依次找下去就可以了…… 代码如下: #include<i ...

  3. 理解 JMeter 聚合报告(Aggregate Report)

    Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告中的各项数据表示什么意思,顺便在这里公布一下,以备大家查阅. 如果 ...

  4. fuel openstack 在 VirtualBox 上的部署

    搞了两天,终于搞好了.说说过程: 一开始用的6.1版本的Fuel.iso,按照国内外的教程装了几遍,但是网路验证始终不能通过.自己又不是很懂网络.后来在网上看到说6.1版的需要fuel-master连 ...

  5. [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句的语法错误。

    遇到的情景: sta.executeUpdate("insert into 表1(longitude,latitude,time) values("+a[0]+",&qu ...

  6. Bootstrap的clearfix

    1.div的内容太多会导致后面的div错位 <!DOCTYPE html> <html> <head> <title>自定义占满wgnu</tit ...

  7. 禁用/启用本地连接的dos命令是什么啊?

    运行如下命令:netsh interface show interface 将显示类似下面的画面:Admin State State Type Interface Name ------------- ...

  8. JBoss 性能优化(解决Jboss内存紧张的问题)

    修改$JBOSS_HOME/bin/run.conf文件   JAVA_OPTS="-Xms 520m -Xmx 1220m -Xss 15120k +XX:AggressiveHeap&q ...

  9. 【图像算法】图像特征:GLCM灰度共生矩阵,纹理特征

    [图像算法]图像特征:GLCM SkySeraph Aug 27th 2011  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modifie ...

  10. 常用Linux命令小结

    常用Linux命令小结 Linux下有很多常用的很有用的命令,这种命令用的多了就熟了,对于我来说,如果长时间没有用的话,就容易忘记.当然,可以到时候用man命令查看帮助,但是,到时候查找的话未免有些临 ...