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\)排序 每次取出颜色的前驱 ...
随机推荐
- 钉钉JSAPI前端鉴权
钉钉二次开发分为如下表所示三种类型的开发,只有企业内部应用才需要对JSAPI鉴权. 类型 开发方式 JSAPI鉴权 应用场景 第三方企业应用 E应用开发 不需要 用于发布到钉钉应用市场,供广大用户下载 ...
- 简易仿ios菊花加载loading图
原文链接:https://mp.weixin.qq.com/s/wBbQgOfr59wntNK9ZJ5iRw 项目中经常会用到加载数据的loading显示图,除了设计根据app自身设计的动画loadi ...
- 浅谈Semaphore类
Semaphore类有两个重要方法 1.semaphore.acquire(); 请求一个信号量,这时候信号量个数-1,当减少到0的时候,下一次acquire不会再执行,只有当执行一个release( ...
- mssql sqlserver 指定特定值排在表前面
转自:http://www.maomao365.com/?p=7141 摘要: 下文讲述sql脚本编写中,将 特定值排在最前面的方法分享, 实验环境:sqlserver 2008 R2 例:将数据表中 ...
- BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程
一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...
- c/c++ 多线程 利用条件变量实现线程安全的队列
多线程 利用条件变量实现线程安全的队列 背景:标准STL库的队列queue是线程不安全的. 利用条件变量(Condition variable)简单实现一个线程安全的队列. 代码: #include ...
- JPA之@Transient
java 的transient关键字的作用是需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中. 使用示例: ...
- 周一01.3Python多版本共存&pip环境变量设置
python多版本共存 1.分别安装Python2.7(手动添加环境变量)与Python3.6 2.分别进入Py2与Py3文件夹中,复制python.exe,重命名为python2.exe和pytho ...
- Django学习开发--笔记一(从零开始)
创建django项目注: 首先需在python中下载django 命令:pip install django1.任意文件中创建django项目 diango-admin startproject my ...
- SQLServer之修改UNIQUE约束
使用SSMS数据库管理工具修改UNIQUE约束 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的键,右键点击,选择修改,后面步骤相同). 2.选择要修改的数据列 ...