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\)排序 每次取出颜色的前驱 ...
随机推荐
- Android安全–加强版Smali Log注入
有的时候我们需要注入smali调用Log输出,打印字符串的值. 比如说: 如果我们要打印下面v1的值. new-instance v1, Ljava/lang/String; const-string ...
- Lucene.Net3.0.3+盘古分词器学习使用
一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...
- Django学习之五:Django 之 注意事项及汇总
目录 Django 之 注意事项及汇总 全局 settings model模块-模型模块 URLs模块 Templates System 模版模块 View/HttpRequest/HttpRespo ...
- vue 如何点击按钮返回上一页
1,vue 如何点击按钮返回上一页呢? 这是vue挂载的范围html代码 <div @click="goOff()">返回</div> 下面是点击返回的方法 ...
- opencv3.2.0图像处理之高斯滤波GaussianBlur API函数
/*高斯滤波:GaussianBlur函数 函数原型: void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double s ...
- Mapbox浅析(快速入门Mapbox)
1.是什么? Mapbox是一个可以免费创建并定制个性化地图的网站. 2.了解一些基本东西 常见的 mapbox.js和mapbox-gl.js的异同点? 相同点: 1.都是由Mapbox公司推出的免 ...
- Python使用Plotly绘图工具,绘制水平条形图
水平条形图与绘制柱状图类似,大家可以先看看我之前写的博客,如何绘制柱状图 水平条形图需要在Bar函数中设置orientation= 'h' 其他的参数与柱状图相同.也可以通过设置barmode = ' ...
- 【学习笔记】【Design idea】一、Java异常的设计思想、性能相关、笔记
1.前言: 异常.本该是多么优雅的东西,然而,得全靠自己在零散的信息中汇集. 学习笔记保持更新. 2.教材(参考资料) 其他 ①受检异常与非受检异常:https://www.cnblogs.com/j ...
- C#开发WEBService服务 C++开发客户端调用WEBService服务
编写WEBService服务端应用程序并部署 http://blog.csdn.net/u011835515/article/details/47615425 编写调用WEBService的C++客户 ...
- iOS MVVM架构总结
为什么使用MVVM iOS中,我们使用的大部分都是MVC架构.虽然MVC的层次明确,但是由于功能日益的增加.代码的维护,使得更多的代码被写在了Controller中,这样Controller就显得非常 ...