bzoj 3571: [Hnoi2014]画框
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
3
4 3 2
2 3 4
3 2 1
2 3 2
2 2 4
1 1 3
Sample Output
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]画框的更多相关文章
- BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3571 [题目大意] 给出一张二分图,每条边上有a,b两个值,求完美匹配, 使得suma ...
- [BZOJ 3571] 画框
Link: BZOJ 3571 传送门 Solution: 和 BZOJ2395 的建模完全相同,(BZOJ2395 题解传送门) 仅仅是将其中的基础问题由最小生成树改成了二分图最大完美匹配 只要将原 ...
- BZOJ 3572: [Hnoi2014]世界树
BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...
- 【LG3236】[HNOI2014]画框
[LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...
- BZOJ 3571 画框 KM算法 最小乘积最大权匹配
题意 有n个画框和n幅画.若第i幅画和第j个画框配对,则有平凡度Aij和违和度Bij,一种配对方案的总体不和谐度为∑Aij*∑Bij.求通过搭配能得到的最小不和谐度是多少. n <= 70. 分 ...
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
- bzoj 3572 [Hnoi2014]世界树(虚树+DP)
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 645 Solved: 362[Submit][Status] ...
- bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
3576: [Hnoi2014]江南乐 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 1929 Solved: 686[Submit][Status ...
随机推荐
- iphone6 plus导入联系人或者通讯录
iphone6 plus快速导入联系人或者通讯录(使用QQ同步助手,真的很简单) 最近换了部手机,由于之前的手机保存联系人都是保存在手机,没有备份在sim卡,由于sim卡被我剪小了,不能插回原来的手机 ...
- java.util.HashMap和java.util.HashTable (JDK1.8)
一.java.util.HashMap 1.1 java.util.HashMap 综述 java.util.HashMap继承结构如下图 HashMap是非线程安全的,key和value都支持nul ...
- web管理kvm ,安装webvirtmgr
原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...
- 50个PHP程序性能优化的方法
1. 用单引号代替双引号来包含字符串,这样做会更快一些.因为 PHP 会在双引号包围的 字符串中搜寻变量,单引号则不会,注意:只有 echo 能这么做,它是一种可以把多个字符 串当作参数的" ...
- Vue单页面骨架屏实践
github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...
- Nginx日志切割案例讲解,Nginx的知识讲解
Nginx 是一个非常轻量的 Web 服务器,体积小.性能高.速度快等诸多优点.但不足的是也存在缺点,比如在产生的访问日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将会导致日志文件容量 ...
- c++对象在lua层的生命周期与内容扩展
前言 上一篇博客记录了 tolua++ 将 c++类型,变量,函数,以及对象导出到 lua 的过程,这篇博客就接着记录一下 c++对象的内存回收以及c++对象数据和方法在lua中的扩展. 首先 tol ...
- 【hdu5419】Victor and Toys
求求求 搞搞搞 搞法例如以下:考虑每一个数w[i]w[i]对答案的贡献,呃. . .首先答案一定是 ∑[...](m3) \sum [...]\over {m\choose 3}的形式,仅仅须要搞分子 ...
- PAT 1004 To Fill or Not to Fill (25)
题目描写叙述 With highways available, driving a car from Hangzhou to any other city is easy. But since the ...
- HTTP请求中怎样选择Get和Post方式
在应用中最经常使用的Http请求无非是get和post,get请求能够获取静态页面,也能够把參数放在URL字串后面,传递给servlet.post与get的不同之处在于post的參数不是放在URL字串 ...