题目链接:传送门

分析

这道题乍看上去没有思路,但是我们仔细一想就会发现这道题其实是一个二分图最大匹配的板子

我们可以把这道题想象成将男生和女生之间两两配对,使他们的好感度最大

我们把矩阵中的元素\(a[x][y]\)看成女生\(x\)和男生\(y\)之间的好感度,跑一个KM算法

因为KM算法会维护\(ex_{}boy[x] + ex_{}girl[y]>=love[y][x]\),所以最后的结果就是我们想要的

注意有多组数据

代码

#include<bits/stdc++.h>
using namespace std;
#define hzoi 0
const int maxn=505;
int love[maxn][maxn];
int ex_girl[maxn],ex_boy[maxn];
bool vis_girl[maxn],vis_boy[maxn];
int match[maxn],slack[maxn];
int n;
bool dfs(int girl){
vis_girl[girl]=1;
for(int boy=1;boy<=n;boy++){
if(vis_boy[boy]) continue;
int gap=ex_girl[girl]+ex_boy[boy]-love[girl][boy];
if(gap==0){
vis_boy[boy]=1;
if(match[boy]==-1 || dfs(match[boy])){
match[boy]=girl;
return 1;
}
} else {
slack[boy]=min(slack[boy],gap);
}
}
return 0;
}
void KM(){
memset(match,-1,sizeof(match));
memset(ex_boy,0,sizeof(ex_boy));
for(int i=1;i<=n;i++){
ex_girl[i]=love[i][1];
for(int j=2;j<=n;j++){
ex_girl[i]=max(love[i][j],ex_girl[i]);
}
}
for(int i=1;i<=n;i++){
memset(slack,0x3f,sizeof(slack));
while(1){
memset(vis_boy,0,sizeof(vis_boy));
memset(vis_girl,0,sizeof(vis_girl));
if(dfs(i)) break;
int d=0x3f3f3f3f;
for(int j=1;j<=n;j++){
if(!vis_boy[j]) d=min(d,slack[j]);
}
for(int j=1;j<=n;j++){
if(vis_girl[j]) ex_girl[j]-=d;
if(vis_boy[j]) ex_boy[j]+=d;
else slack[j]-=d;
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(love,0,sizeof(love));
memset(ex_girl,0,sizeof(ex_girl));
memset(ex_boy,0,sizeof(ex_boy));
memset(vis_girl,0,sizeof(vis_girl));
memset(vis_boy,0,sizeof(vis_boy));
memset(match,0x3f,sizeof(match));
memset(slack,-1,sizeof(slack));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&love[i][j]);
}
}
KM();
int ans=0;
for(int i=1;i<=n;i++){
if(i==1) printf("%d",ex_girl[i]);
else printf(" %d",ex_girl[i]);
ans+=ex_girl[i];
}
printf("\n");
for(int i=1;i<=n;i++){
if(i==1) printf("%d",ex_boy[i]);
else printf(" %d",ex_boy[i]);
ans+=ex_boy[i];
}
printf("\n%d\n",ans);
}
return 0;
}

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

  1. UVA11383 Golden Tiger Claw —— KM算法

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

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

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

  3. UVA11383 Golden Tiger Claw

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

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

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

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

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

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

  7. Golden Tiger Claw(二分图)

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

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

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

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

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

随机推荐

  1. (三)linux三剑客之sed

    一.sed是什么? 二.sed的工作原理? 三.sed的基本用法? 四.sed的进阶使用? 一.sed是什么? sed 就是一个非交互式流编译器: 交互式:文件缓存.人工编译.全局并行可逆 非交互式: ...

  2. Python3.7解释器+sublime Text3编辑器+案例打包软件+Python语言程序设计基础教材

    编辑器:https://nsyw.lanzous.com/i7lcdyh Python3.7 https://nsyw.lanzous.com/i7a299c 案例 https://nsyw.lanz ...

  3. centos7上安装memcached以及PHP安装memcached扩展(二)

    开始在 PHP 中使用 Memcached 前, 我们需要确保已经安装了 Memcached  服务,接下来安装 php-memcached 扩展. PHP Memcached 扩展安装 第一步:如果 ...

  4. Trouble and solution

    Prevent the CTRL from rebooting in loop killall scm watch echo 1 > /dev/watchdog& Install Git ...

  5. Fibonacci(模板)【矩阵快速幂】

    Fibonacci 题目链接(点击) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20989   Accepted: 14 ...

  6. MySQL ORDER BY:对查询结果进行排序

    在 MySQL SELECT 语句中,ORDER BY 子句主要用来将结果集中的数据按照一定的顺序进行排序. 其语法格式为: ORDER BY {<列名> | <表达式> | ...

  7. Spark文档阅读之一:Spark Overview

    Document: https://spark.apache.org/docs/latest/index.html 版本:2.4.5   1. spark的几种执行方式 1)交互式shell:bin/ ...

  8. CKAD个人考试心得

    先晒一波本人的CKA和CKAD证书! 如下正式分享CKAD心得: 考试相关准备: l 练习:https://github.com/dgkanatsios/CKAD-exercises: l 网络:必须 ...

  9. 涨姿势了解一下Kafka消费位移可好?

    摘要:Kafka中的位移是个极其重要的概念,因为数据一致性.准确性是一个很重要的语义,我们都不希望消息重复消费或者丢失.而位移就是控制消费进度的大佬.本文就详细聊聊kafka消费位移的那些事,包括: ...

  10. SQLserver 的分页存储过程

      -- 1.建立修改学生数据的存储过程 -- 2.建立根据班级Id和学生姓名模糊查询的分页存储过程,要求正确输出总记录数,总页数-- (输入班学生姓名 计算总记录数 计算总页数) -- @name ...