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。

输出格式:

一个整数,计算出的男女双方竞赛优势的总和的最大值。

输入输出样例

输入样例#1:

3
10 2 3
2 3 4
3 4 5
2 2 2
3 5 3
4 5 1
输出样例#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的任务 题解的更多相关文章

  1. T66099 小xzy的数对 题解

    T66099 小xzy的数对 题目背景 老师带同学参加表演,要求学生两两一组表演,但有些学生一起会发生冲突,现在老师想知道有多少组学生分到一起时不会发生冲突. 题目描述 学生发生冲突当且仅当他们身上的 ...

  2. 小Z的袜子(题解)(莫队)

    小Z的袜子(题解)(莫队) Junlier良心莫队 题目 luoguP1494 [国家集训队]小Z的袜子 code #include<bits/stdc++.h> #define lst ...

  3. 小B的询问(题解)(莫队)

    小B的询问(题解)(莫队) Junlier良心莫队 题目 luoguP2709 小B的询问 code #include<bits/stdc++.h> #define lst long lo ...

  4. 小Z的袜子 题解报告【莫队】

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...

  5. BZOJ3781:小B的询问——题解

    https://www.luogu.org/problemnew/show/2709 http://www.lydsy.com/JudgeOnline/problem.php?id=3781 题目描述 ...

  6. BZOJ2038:[2009国家集训队]小Z的袜子——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找 ...

  7. [HG]小G坐电梯 题解

    C 小G坐电梯 题目描述 小G来到了著名的某大厦.大厦一共有n层,初始的时候小G在第 A 层. 小G特别想去B层小 M 的办公室看一看,然而因为安保原因,B层已经被封锁无法进入. 但是小G既然来了,就 ...

  8. HiHoCoder1513:小Hi的烦恼——题解

    https://hihocoder.com/problemset/problem/1513 小Hi从小的一大兴趣爱好就是学习,但是他发现尽管他认真学习,依旧有学神考的比他好. 小Hi在高中期间参加了市 ...

  9. bzoj4548: 小奇的糖果 题解

    题目链接 题解 不包含所有颜色 就强制不选一个颜色 图中圆点颜色相同 矩形越大,包括的点一定不比其一小部分少 如图所示,最大矩形只有3种 离散化\(x\)坐标 然后按\(y\)排序 每次取出颜色的前驱 ...

随机推荐

  1. RESTful api风格介绍

    RESTful 接口是目前来说比较流行的一种接口,平常在开发中会非常常见. 有过和后端人员对接接口的小伙伴都应该知道,我们所做的大多数操作都是对数据库的四格操作 “增删改查” 对应到我们的接口操作分别 ...

  2. mybatis基础(下)

    mybatis和spring整合 需要spring通过单例方式管理SqlSessionFactory spring和mybatis整合生成代理对象,使用SqlSessionFactory创建SqlSe ...

  3. Bable实现由ES6转译为ES5

    Babel是一个广泛使用的转码器,可以将ES6代码转译为ES5代码,从而在现有环境下执行. 举例说明: 转译前(ES6格式)代码如下: let User = { name : '张三', age : ...

  4. .NET的未来-广州.NET俱乐部学生分会

    偶然的一次机会,让我发现了在我们社区的微信群里潜藏着许多高校的学生,他们有的来自重点高校中山大学.华南理工,也有的来自普通高校的惠州学院.广州白云学院等. 因为相同的技术爱好使他们聚集在社区.相同的技 ...

  5. C#监控指定目录的文件变化的代码

    如下的资料是关于C#监控指定目录的文件变化的代码. FileSystemWatcher watcher = new FileSystemWatcher();watcher.Path = @" ...

  6. 从零学习Fluter(四):Flutter中ListView组件系列详展

    今天继续研究了一些Flutter,主要时关于ListVIew那一块的东西,有 SingleChildScrollViewListViewGridViewCustomScrollView 感觉Flutt ...

  7. django源码分析 请求流程

    一.从浏览器发出一个请求,到返回响应内容,这个过程是怎么样的? 1. 浏览器解析输入的url 2. 查找url对应的ip地址 3. 通过ip地址访问我们的服务器 1.  请求进入wsgi服务器(我在这 ...

  8. SQL语句(理论)

    1.SQL已经成为关系数据库的标准语言 2.SQL是一个非过程化的语言,因为他一次处理一个记录 3.SQL命令比较简单,最高级的命令几天之内便可掌握. 有属下类型的命令: 查询数据. 在表中插入.修改 ...

  9. MPP架构海量数据分析仓库——Greenplum介绍

    一.Greenplum背景 时间回到2002年,互联网行业经过近10年的发展,数据量正处于快速增长期: 1.传统的主机计算模式在海量数据面前,除了造价昂贵外,在CPU计算和IO吞吐上不能满足海量数据的 ...

  10. REST风格架构

    一说到rest 大家都耳熟能详,很多人的第一反应就是其是前后端请求后台的一种通信方式,甚至有些人将REST 和RPC 混为一谈,认为两者都是基于HTTP类似的东西.实际上很少人能叙述REST 所提出的 ...