Description

小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框。为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和。对于第 幅画与第 个画框的配对,小T都给出了这个配对的平凡度Aij 与违和度Bij 。整个搭配方案的总体不和谐度为每对画与画框平凡度之和与每对画与画框违和度的乘积。具体来说,设搭配方案中第i幅画与第Pi个画框配对,则总体不和谐度为

小T希望知道通过搭配能得到的最小的总体不和谐度是多少。

Input

输入文件第 行是一个正整数T ,表示数据组数,接下来是T组数据。
对于每组数据,第 行是一个正整数N,表示有N对画和画框。
第2到第N+1行,每行有N个非负整数,第i+1 行第j个数表示Aij 。
第N+2到第2*N+1行,每行有N个非负整数,第i+N+1 行第j个数表示Bij 。

Output

包含T行,每行一个整数,表示最小的总体不和谐度

Sample Input

1
3
4 3 2
2 3 4
3 2 1
2 3 2
2 2 4
1 1 3

Sample Output

30

HINT

第1幅画搭配第3个画框,第2幅画搭配第1个画框,第3 幅画搭配第2个画框,则总体不和谐度为30

N<=70,T<=3,Aij<=200,Bij<=200

Source

如果知道最小乘积生成树的话,那这题就是真的裸得不能再裸了;

具体操作是这样的,把一个最大匹配的∑ai看成横坐标,∑bi看成纵坐标,那么就是就对应着平面上的点(x,y),答案就是x*y;

我们发现答案一定在下凸壳上,然后我们考虑如何求解,与二维乘积最小生成树是一样的;

这里发一个最小乘积生成树的链接,说得特别好,主要是有图:http://www.cnblogs.com/autsky-jadek/p/3959446.html

具体思想就是确定一条直线,然后在左下方找一个距离最远的点,找这个点就是找三角形面积最大的点,这个就是把叉积的式子展开,然后用费用流找到那个点,

然后往下递归,直到左下角没有点,这个用叉积面积<=0判;

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=20050;
const int Inf=2147483647;
struct Point{
int x,y;
};
int a[100][100],b[100][100],S,T,n,ans,tmp,cnt;
struct data{
int head[N],to[N],nxt[N],s[N],cc[N],in[N],fa[N],vx[N],vy[N],q[N*10],dis[N],cost;
void Addedge(int x,int y,int z,int u,int X,int Y) {
to[++cnt]=y,s[cnt]=z,cc[cnt]=u,nxt[cnt]=head[x],head[x]=cnt,vx[cnt]=X,vy[cnt]=Y;
}
void lnk(int x,int y,int z,int u,int X,int Y) {
Addedge(x,y,z,u,X,Y),Addedge(y,x,0,-u,-X,-Y);
}
bool spfa(Point &a) {
for(int i=S; i<=T; i++) dis[i]=Inf,in[i]=0;
int t=0,sum=1;
q[0]=S,in[S]=1,dis[S]=0;
while(t<sum) {
int x=q[t++];in[x]=0;
for(int i=head[x];i;i=nxt[i]) {
int y=to[i];
if(s[i]&&dis[y]>dis[x]+cc[i]) {
dis[y]=dis[x]+cc[i];fa[y]=i;
if(!in[y]) in[y]=1,q[sum++]=y;
}
}
}
if(dis[T]==Inf) return 0;
for(int i=fa[T];i;i=fa[to[i^1]]){
a.x+=vx[i];a.y+=vy[i];
s[i]--,s[i^1]++;
}
cost+=dis[T];
return 1;
}
Point Mincost() {Point c=(Point){0,0};while(spfa(c));return c;;}
void build(int X,int Y){
memset(head,0,sizeof(head));cnt=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
lnk(i,j+n,1,X*a[i][j]+Y*b[i][j],a[i][j],b[i][j]);
}
lnk(S,i,1,0,0,0);lnk(i+n,T,1,0,0,0);
}
}
}Gragh;
int Cross(Point a,Point b,Point c){
return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
void solve(Point a,Point b){
Gragh.build(a.y-b.y,b.x-a.x);Point C=Gragh.Mincost();
ans=min(ans,C.x*C.y);
if(Cross(b,a,C)<=0) return;
solve(a,C);solve(C,b);
}
int main(){
freopen("frame.in","r",stdin);
freopen("frame.out","w",stdout);
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);S=0,T=2*n+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) scanf("%d",&b[i][j]);
}
Gragh.build(1,0);
Point A=Gragh.Mincost();
Gragh.build(0,1);
Point B=Gragh.Mincost();
ans=Inf;ans=min(ans,min(A.x*A.y,B.x*B.y));
solve(A,B);printf("%d\n",ans);
}
return 0;
}
 

bzoj 3571: [Hnoi2014]画框的更多相关文章

  1. BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3571 [题目大意] 给出一张二分图,每条边上有a,b两个值,求完美匹配, 使得suma ...

  2. [BZOJ 3571] 画框

    Link: BZOJ 3571 传送门 Solution: 和 BZOJ2395 的建模完全相同,(BZOJ2395 题解传送门) 仅仅是将其中的基础问题由最小生成树改成了二分图最大完美匹配 只要将原 ...

  3. BZOJ 3572: [Hnoi2014]世界树

    BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...

  4. 【LG3236】[HNOI2014]画框

    [LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...

  5. BZOJ 3571 画框 KM算法 最小乘积最大权匹配

    题意 有n个画框和n幅画.若第i幅画和第j个画框配对,则有平凡度Aij和违和度Bij,一种配对方案的总体不和谐度为∑Aij*∑Bij.求通过搭配能得到的最小不和谐度是多少. n <= 70. 分 ...

  6. BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...

  7. bzoj 3572: [Hnoi2014]世界树 虚树 && AC500

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 520  Solved: 300[Submit][Status] ...

  8. bzoj 3572 [Hnoi2014]世界树(虚树+DP)

    3572: [Hnoi2014]世界树 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 645  Solved: 362[Submit][Status] ...

  9. bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理

    3576: [Hnoi2014]江南乐 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1929  Solved: 686[Submit][Status ...

随机推荐

  1. python之列表(list)的使用方法介绍

    python之列表(list)介绍 在python的使用过程中,我们经常会用到列表,然而经常会遇到疑惑,下面我将详细介绍下列表使用方法. 一.列表 列表经常用到的功能使增.删.改和查功能. 1. 增 ...

  2. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  3. 【译】10个机器学习的JavaScript示例

    原文地址:10 Machine Learning Examples in JavaScript 在过去的每一年,用于机器学习(Machine Learning)的库在变得越来越快和易用.一直以来Pyt ...

  4. 《Linux命令行与shell脚本编程大全》第十八章 图形化桌面环境中的脚本编程

    18.1 创建文本菜单 直接上例子吧:   1 #!/bin/bash   2 function menu   3 {   4         clear   5         echo   6   ...

  5. Git快速入门和常用命令

    一.快速入门 本地初始化一个项目 首先,你需要执行下面两条命令,作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中. git config --global us ...

  6. C/C++筛选法算素数

    什么是求素数 )i在2到n-1之间任取一个数,如果n能被整除则不是素数,否则就是素数 普通枚举法: #include <iostream> #include <string> ...

  7. 参加完Rocket MQ Meetup深圳站,回顾和想法

    最近一段时间才开始关注云栖社区的公众号,在两周前看到要在深圳科兴科学园办一场Rocket MQ的Meetup.因为从来没有参加过这种线下活动,而且对Rocket MQ比较感兴趣,所以就立即报名参加. ...

  8. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  9. FiddlerCoreAPI开发(一)源码分析

    1.前言 前一段时间想利用fiddlercore截取本地HTTPS的流量做一些分析,按照样例代码的注释学习了一下,没搞清楚怎么实现,后来又在网上查了些资料,对HTTPS的处理提及很少,都没有解决我的问 ...

  10. 赵雅智:service与訪问者之间进行通信,数据交换

    服务类 中间人:service服务中的bind对象 创建中间人并通过onBinder方法的return暴露出去 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQ ...