Description

题库链接

求 \(2\times N\) 个点的带权二分图最佳匹配。

\(1\leq N\leq 20\)

Solution

我还是太菜了啊...到现在才学 \(KM\) 。

Code

//It is made by Awson on 2018.3.8
#include <bits/stdc++.h>
#define LL long long
#define dob complex<double>
#define Abs(a) ((a) < 0 ? (-(a)) : (a))
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Swap(a, b) ((a) ^= (b), (b) ^= (a), (a) ^= (b))
#define writeln(x) (write(x), putchar('\n'))
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N = 20, INF = ~0u>>1;
void read(int &x) {
char ch; bool flag = 0;
for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar());
for (x = 0; isdigit(ch); x = (x<<1)+(x<<3)+ch-48, ch = getchar());
x *= 1-2*flag;
}
void print(int x) {if (x > 9) print(x/10); putchar(x%10+48); }
void write(int x) {if (x < 0) putchar('-'); print(Abs(x)); } int n, a[N+5][N+5], x;
int vis1[N+5], vis2[N+5], E1[N+5], E2[N+5], sla[N+5], match[N+5]; bool dfs(int u) {
vis1[u] = 1;
for (int i = 1; i <= n; i++)
if (vis2[i] == 0) {
int tmp = E1[u]+E2[i]-a[u][i];
if (tmp == 0) {
vis2[i] = 1;
if (match[i] == 0 || dfs(match[i])) {
match[i] = u; return true;
}
}else sla[i] = Min(sla[i], tmp);
}
return false;
}
int KM() {
for (int i = 1; i <= n; i++) {
E1[i] = E2[i] = match[i] = 0;
for (int j = 1; j <= n; j++) E1[i] = Max(E1[i], a[i][j]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) sla[j] = INF;
while (1) {
for (int j = 1; j <= n; j++) vis1[j] = vis2[j] = 0;
if (dfs(i)) break;
int tmp = INF;
for (int j = 1; j <= n; j++) if (vis2[j] == 0) tmp = Min(tmp, sla[j]);
for (int j = 1; j <= n; j++) {
if (vis1[j]) E1[j] -= tmp;
if (vis2[j]) E2[j] += tmp; else sla[j] -= tmp;
}
}
}
int ans = 0;
for (int i = 1; i <= n; i++) ans += a[match[i]][i];
return ans;
}
void work() {
read(n);
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) read(a[i][j]);
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) read(x), a[j][i] *= x;
writeln(KM());
}
int main() {
work(); return 0;
}

[Luogu 1559]运动员最佳匹配问题的更多相关文章

  1. Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配)

    Luogu 1559 运动员最佳匹配问题(带权二分图最大匹配) Description 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的 ...

  2. KM模板 最大权匹配(广搜版) Luogu P1559 运动员最佳匹配问题

    KM板题: #include <bits/stdc++.h> using namespace std; inline void read(int &num) { char ch; ...

  3. [洛谷 P1559] 运动员最佳匹配问题

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  4. 运动员最佳匹配问题 KM算法:带权二分图匹配

    题面: 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  5. P1559 运动员最佳匹配问题[最大费用最大流]

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  6. 【题解】P1559 运动员最佳匹配问题

    [题目](https://www.luogu.com.cn/problem/P1559) 题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组 ...

  7. P1559 运动员最佳匹配问题

    题目描述 羽毛球队有男女运动员各n人.给定2 个n×n矩阵P和Q.P[i][j]是男运动员i和女运动员j配对组成混合双打的男运动员竞赛优势:Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势 ...

  8. 洛谷p1559运动员最佳匹配问题

    题目 搜索 可行性剪枝 虽然这题目是我搜二分图的标签搜到的 但是n比较小 明显可以暴力 然而只有80分 再加上可行性剪纸就行啦 就是记所有运动员他所能匹配到的最大值. 在我们搜索到第i层的时候 如果他 ...

  9. 运动员最佳匹配问题(km算法)

    洛谷传送门 带权二分图最大权完美匹配. 裸的km算法. 注意开long long. #include <cstdio> #include <cstring> #include ...

随机推荐

  1. New UWP Community Toolkit - RadialProgressBar

    概述 UWP Community Toolkit  中有一个圆形的进度条控件 - RadialProgressBar,本篇我们结合代码详细讲解  RadialProgressBar 的实现. Radi ...

  2. RTMP消息详细介绍

    本文继上篇简单分析了RTMP协议如何进行通信进一步详细分析RTMP的消息都有哪些,以及这些消息有什么作用. 一.RMTP消息 由上一篇文章可知RTMP 消息有分成两个部分,一个是头部,一个是有效负载. ...

  3. C语言博客作业—嵌套循环

    一.PTA实验作业 题目1:7-4 换硬币 1. 本题PTA提交列表 2. 设计思路 (1)定义整型变量money表示待换的零钱总额,p5表示5分硬币的数量,p2表示2分硬币的数量,p1表示1分硬币的 ...

  4. 高级软件工程第三次作业 赵坤&黄亦薇

    0.小组成员 赵坤2017282110261 黄亦薇201728210260 1.项目Github地址  https://github.com/zkself/homework3 PS:建议使用chro ...

  5. maven添加oracle驱动

    由于oracle商业版权问题,maven是不可以直接下载jar包的,所以..   先将ojdbc14.jar放到用户目录,win7放到C:\Users\Administrator然后在cmd执行   ...

  6. 判断mine类型

    var http = require("http"); var fs = require("fs"); var url = require("url& ...

  7. iOS开发-简单的循环结构分析

    1.while循环 while (循环条件) {         循环体: } // 1.定义循环变量 ; // 2.循环条件 ) { // 3.循环体 printf("%d\n" ...

  8. linux 50个常用命令

    1.ls命令 ls是list的缩写,常用命令为ls(显示出当前目录列表),ls -l(详细显示当前目录列表),ls -lh(人性化的详细显示当前目录列表),ls -a(显示出当前目录列表,包含隐藏文件 ...

  9. 【深度学习】深入理解Batch Normalization批标准化

    这几天面试经常被问到BN层的原理,虽然回答上来了,但还是感觉答得不是很好,今天仔细研究了一下Batch Normalization的原理,以下为参考网上几篇文章总结得出. Batch Normaliz ...

  10. 进军ABP第一天:ABP理论知识

    1.2.3 领域层领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现. ( 实体(Entity ) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表. ( 仓储(Repo ...