T66597 小xzy的任务 题解
T66597 小xzy的任务
题目背景
今天,小xzy的班主任交给他一个严肃的任务,匹配羽毛球运动员! ! !
题目描述
羽毛球队有男女运动员各n人。给定2个n×n矩阵P和Q。Pij是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势;Qij是女运动员ii和男运动员j配合的女运动员竞赛优势。由于技术配合和心理状态等各种因素影响,Pij不一定等于Qji。男运动员ii和女运动员jj配对组成混合双打的男女双方竞赛优势为Pij∗Qji。设计一个算法,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。
编程任务
设计一个算法,对于给定的男女运动员竞赛优势,计算男女运动员最佳配对法,使各组男女双方竞赛优势的总和达到最大。
输入输出格式
输入格式:
第一行有1 个正整数n (2≤n≤1000)。接下来的2n行,每行n个数。前n行是p,后n行是q。
输出格式:
一个整数,计算出的男女双方竞赛优势的总和的最大值。
输入输出样例
3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
52
说明
0≤n≤1000,0≤Pij,Qij≤1000
第一个测试点:n≤100
这题我们把男运动员和女运动员看成两个集合,于是这题便可以看成是带权二分图匹配。
带权二分图匹配通常使用KM算法。
不了解KM算法的请移步。
code:
#include <cstdio>
const int MAXN=2005;
const int INF=0x3f3f3f3f;
int n,now=0;
int rela[MAXN][MAXN],match[MAXN];
int ex_boy[MAXN],ex_girl[MAXN],slack[MAXN];
int vis_boy[MAXN],vis_girl[MAXN];
int boy[MAXN][MAXN],girl[MAXN][MAXN]; void read(int &x)
{
int out=1;
char c;x=0;
while(c<'0' || c>'9'){if(c=='-')out=-1;c=getchar();}
while(c>='0'&&c<='9')
{
x=x*10+c-48;
c=getchar();
}
x=x*out;
} void write(long long x)
{
if(x>10)write(x/10);
putchar(x%10+48);
} void init()
{
read(n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)read(boy[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)read(girl[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
rela[i][j]=boy[i][j]*girl[j][i];
} int dfs(int x)
{
int cp;
vis_girl[x]=now;
for(int y=1;y<=n;y++)
{
if(vis_boy[y]==now)continue;
cp=ex_girl[x]+ex_boy[y]-rela[x][y];
if(cp==0)
{
vis_boy[y]=now;
if((match[y]==0)||dfs(match[y]))
{
match[y]=x;return true;
}
}
else if(cp<slack[y])slack[y]=cp;
}
return false;
} long long KM()
{
for(int i=1;i<=n;i++)
{
match[i]=ex_girl[i]=ex_boy[i]=0;
for(int j=1;j<=n;j++)
if(rela[i][j]>ex_girl[i])ex_girl[i]=rela[i][j];
}
for(int i=1;i<=n;i++)
{
now=0;
for(int j=1;j<=n;j++)
{
slack[j]=INF;
vis_boy[j]=vis_girl[j]=0;
}
while(1)
{
now++;
if(dfs(i))break;
int d=INF;
for(int j=1;j<=n;j++)if(vis_boy[j]!=now&&slack[j]<d)d=slack[j];
for(int j=1;j<=n;j++)
{
if(vis_girl[j]==now)ex_girl[j]-=d;
if(vis_boy[j]==now)ex_boy[j]+=d;
else slack[j]-=d;
}
}
}
long long res=0;
for(int i=1;i<=n;i++)res+=rela[match[i]][i];
return res;
} int main()
{
init();
write(KM());
return 0;
}
T66597 小xzy的任务 题解的更多相关文章
- T66099 小xzy的数对 题解
T66099 小xzy的数对 题目背景 老师带同学参加表演,要求学生两两一组表演,但有些学生一起会发生冲突,现在老师想知道有多少组学生分到一起时不会发生冲突. 题目描述 学生发生冲突当且仅当他们身上的 ...
- 小Z的袜子(题解)(莫队)
小Z的袜子(题解)(莫队) Junlier良心莫队 题目 luoguP1494 [国家集训队]小Z的袜子 code #include<bits/stdc++.h> #define lst ...
- 小B的询问(题解)(莫队)
小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...
- 小Z的袜子 题解报告【莫队】
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- BZOJ3781:小B的询问——题解
https://www.luogu.org/problemnew/show/2709 http://www.lydsy.com/JudgeOnline/problem.php?id=3781 题目描述 ...
- BZOJ2038:[2009国家集训队]小Z的袜子——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找 ...
- [HG]小G坐电梯 题解
C 小G坐电梯 题目描述 小G来到了著名的某大厦.大厦一共有n层,初始的时候小G在第 A 层. 小G特别想去B层小 M 的办公室看一看,然而因为安保原因,B层已经被封锁无法进入. 但是小G既然来了,就 ...
- HiHoCoder1513:小Hi的烦恼——题解
https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...
- bzoj4548: 小奇的糖果 题解
题目链接 题解 不包含所有颜色 就强制不选一个颜色 图中圆点颜色相同 矩形越大,包括的点一定不比其一小部分少 如图所示,最大矩形只有3种 离散化\(x\)坐标 然后按\(y\)排序 每次取出颜色的前驱 ...
随机推荐
- python学习笔记(十 一)、GUI图形用户界面
python图形用户界面就是包含按钮.输入框.选择框等组件的窗口.主要依赖与工具包进行代码编写.python GUI工具包并发互斥的,你可以选择多个工具包进行安装,有极大选择空间.每个工具包都有不同用 ...
- Activiti(二) springBoot2集成activiti,集成activiti在线设计器
摘要 本篇随笔主要记录springBoot2集成activiti流程引擎,并且嵌入activiti的在线设计器,可以通过浏览器直接编辑出我们需要的流程,不需要通过eclipse或者IDEA的actiB ...
- Netty学习笔记(四) 简单的聊天室功能之服务端开发
前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...
- Maven的基础了解与使用
目录 Maven的介绍: 什么是Maven: 为什么要学习maven? 安装与配置: 下载: 配置环境变量 测试安装结果: Maven概念: 坐标 仓库 入门示例 创建maven工程: 添加依赖 Ma ...
- 【公众号系列】SAP的新零售
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[公众号系列]SAP的新零售 写在前面 还是 ...
- c/c++ 多线程 等待一次性事件 packaged_task用法
多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...
- Proxmox VE中出现TASK ERROR: command 'apt-get update' failed: exit code 100的解决方法
问题描述: 出现这个错误一般在WEB或者在Proxmox VE的服务器上面能看到日志: PVE中出现TASK ERROR: command 'apt-get update' failed: exit ...
- 【PAT】B1016 部分A+B
水题 以字符和字符串形式储存输入,比较,计算出两个个数的D的个数,用for循环拼成P,相加得出结果 #include<stdio.h> int main(){ char A[20],DA, ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- 做为一个Python程序员的基本素养
今天在学习的过程中,明白了一些不是Python标准所必须要做的事情,二是做为一个合格的Python程序员应该所遵从的一些规范 分享给大家,有不足的地方请大家指正,此下是我学习的一点心得: 1.在给变量 ...