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. String的Intern方法

    jdk6 和 jdk7 下 intern 的区别 相信很多 JAVA 程序员都做做类似 String s = new String("abc")这个语句创建了几个对象的题目. 这种 ...

  2. Less的!important关键字

    Less的!important关键字 在调用 mixin 时,如果在后面追加 !important 关键字,就可以将 mixin 里面的所有属性都标记为 !important.如,以下Less代码: ...

  3. nginx反向代理node.js获取客户端IP

    使用Nginx做node.js程序的反向代理,会有这么一个问题:在程序中获取的客户端IP永远是127.0.0.1 如果想要拿到真实的客户端IP改怎么办呢? 一.首先配置Nginx的反向代理 proxy ...

  4. Ubuntu下删除VMware的方法

    一般我们都装的是Vmware workstation版的,所以,我们在终端下输入 sudo vmware-installer -u vmware-workstation 然后就会弹出vmware的卸载 ...

  5. springboot-helloworld

    1使用idea创建springboot项目如下图所示 并选择web模块 2,登录springboot官网 http://projects.spring.io/spring-boot/ 引入相关依赖包如 ...

  6. webMagic解析淘宝cookie 提示Invalid cookie header

    webMagic解析淘宝cookie 提示Invalid cookie header 在使用webMagic框架做爬虫爬取淘宝极又家页面时候一直提醒cookie设置不可用如下图 淘宝的验证特别严重,c ...

  7. C#设计模式之十九状态模式(State Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...

  8. sed命令针对文件操作具体解释

    Linux的简单shell脚本中改动文件操作 1.Sed简单介绍 sed 是一种在线编辑器,它一次处理一行内容.处理时.把当前处理的行存储在暂时缓冲区中,称为"模式空间"(patt ...

  9. 打印杨辉三角 --JS

    var arr = new Array(); for(var i = 0 ;i < 6 ; i++){ if(i == 0){arr.push(1);} else if(i == 1){arr ...

  10. Android PopupWindows

    今天了解到PopupWindows这个布局,PopupWindow这个类用来实现一个弹出框,能够使用随意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 以下是一个实例 xml ...