Description

题库链接

\(T\) 组询问,每组询问给你个 \(2\times N\) 的带权二分图,两个权值 \(a,b\) ,让你做匹配使得 \[\sum a\times \sum b\] 最小。

\(N\leq 70,T\leq 3\)

Solution

容易发现就是 [COGS 2401]Time is Money 的变种。

我们用相同的思路,只是将 \(kruskal\) 求最小生成树的过程改为 \(KM\) 求最佳匹配。由于 \(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 = 70, INF = 1e9;
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)); }struct node {int x, y;node (int _x = 0, int _y = 0) {x = _x, y = _y; }int operator * (const node &b) const {return x*b.y-y*b.x; }node operator + (const node &b) const {return node(x+b.x, y+b.y); }node operator - (const node &b) const {return node(x-b.x, y-b.y); }void print() {writeln(x*y); }
}ans, A, B;
int n, a[N+5][N+5], b[N+5][N+5], c[N+5][N+5];
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]-c[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;
}
node KM() {for (int i = 1; i <= n; i++) {E1[i] = -INF; E2[i] = match[i] = 0;for (int j = 1; j <= n; j++) E1[i] = Max(E1[i], c[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;}}}node ans;for (int i = 1; i <= n; i++) ans = ans+node(a[match[i]][i], b[match[i]][i]);return ans;
}
void update(node &ans, node x) {if (x.x*x.y < ans.x*ans.y) ans = x; }
bool judge(node A, node B, node C) {return (B-A)*(C-A) >= 0; }
void doit(node A, node B) {int x = A.x-B.x, y = B.y-A.y; node C;for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) c[i][j] = a[i][j]*y+b[i][j]*x;update(ans, C = KM());if (judge(A, B, C)) return;doit(A, C); doit(C, B);
}
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(b[i][j]);for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) c[i][j] = -a[i][j];A = ans = KM();for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) c[i][j] = -b[i][j];update(ans, B = KM());doit(A, B); ans.print();
}
int main() {int t; read(t); while (t--) work(); return 0;
}

转载于:https://www.cnblogs.com/NaVi-Awson/p/8529148.html

[HNOI 2014]画框相关推荐

  1. [HNOI 2014] 米特运输

    [HNOI 2014] 米特运输 题目描述 题目 题目描述 输入格式 输出格式 样例输入 样例输出 提示 解题过程 思路 代码 感想 题目描述 一道树形dp 题目 题目描述 米特是D星球上一种非常神秘 ...

  2. [HNOI 2014]道路堵塞

    Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国 交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有 ...

  3. [HNOI 2014]米特运输

    Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储 存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市 ...

  4. HNOI 2014 Day1 米特运输

    第 3 题:米特运输(meat),运行时限 2s,内存上限 128M,100 分. [问题描述] 米特是 D 星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的 D 星 上,这种米特能源 ...

  5. 2014工作报名+总结

    图书系统 展示图: 项目步骤 0:同业务员分析需求 1:抓取数据,这些数据足足有306G,4000多本pdf图书 2:搭建前台静态页面,使用jquery解决了在IE8.IE6不兼容故障 3:开始搭建框 ...

  6. CV算法复现(分类算法4/6):GoogLeNet(2014年 谷歌)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  7. CV算法复现(分类算法3/6):VGG(2014年 牛津大学)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  8. 2014.4新版uboot启动流程分析

    原文 http://blog.csdn.net/skyflying2012/article/details/25804209 此处转载有稍作修改 最近开始接触uboot,现在需要将2014.4版本ub ...

  9. 2014年个人工作总结

    2014年的日常工作,从技术支持岗位调到市场.社区岗位上:日常技术处理工作变为博客.微信.微博.市场活动策划.发送奖品等.如果以此为界:即毕业10年内的主要是软件研发.团队管理.项目管理:第二个十年开 ...

最新文章

  1. C语言的单链表创建:头插法/尾插法
  2. 哈尔滨理工大学软件与微电子学院程序设计竞赛 题解
  3. 比特币现金支持者为BCH引入了各种新概念
  4. C#数组 动态添加元素
  5. gRPC in ASP.NET Core 3.x -- Protocol Buffer(3)更新消息类型
  6. Linux 中 VIM 的使用
  7. C++ 预处理与宏相关编程(#,##等等)
  8. 实践案例丨利用小熊派开发板获取土壤湿度传感器的ADC值
  9. bzoj1069 [SCOI2007]最大土地面积 凸包+单调性
  10. 计算机教师的幸福,如何成为一名幸福信息技术教师
  11. gitlab汉化及关联LDAP
  12. 【王道考研计算机网络】—速率相关的性能指标
  13. 融云开发案例核心代码分享
  14. 段上的等待事件 —— enq: HW - contention(oracle)
  15. Qtp10安装过程遇到的问题
  16. PC 显示屏 D-SUB DVI 切换
  17. 论文阅读 | FoveaBox: Beyond Anchor-based Object Detector
  18. 古训:能控制早晨的人,方可控制人生(经典)
  19. 零基础入门python web 自动化测试_python web自动化测试,入门篇
  20. Win11右键菜单还原Win10

热门文章

  1. 打造属于自己的图文符号库
  2. Redhat的硬盘安装
  3. jsp基础、el技术、jstl标签、javaEE的开发模式
  4. ECMAScript 6中的let和const关键词
  5. Struts2框架的学习遇到的问题
  6. 希尔排序算法原理与实现
  7. 编译glib-1.2.20-r5出错./libtool: line 297
  8. Android Scroller 使用详解
  9. 华丽丽的GridLayout-使用案例
  10. GIT中打标签(tag)的意义