[HNOI2014]画框
题目描述
小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框。为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和。
对于第 幅画与第 个画框的配对,小T都给出了这个配对的平凡度Aij 与违和度Bij 。整个搭配方案的总体不和谐度为每对画与画框平凡度之和与每对画与画框违和度的乘积。具体来说,设搭配方案中第i幅画与第Pi个画框配对,则总体不和谐度为
小T希望知道通过搭配能得到的最小的总体不和谐度是多少。
输入输出格式
输入格式:
输入文件第 行是一个正整数T ,表示数据组数,接下来是T组数据。对于每组数据,第
行是一个正整数N,表示有N对画和画框。第2到第N+1行,每行有N个非负整数,第i+1 行第j个数表示Aij
。第N+2到第2*N+1行,每行有N个非负整数,第i+N+1 行第j个数表示Bij 。
输出格式:
包含T!行,每行一个整数,表示最小的总体不和谐度
输入输出样例
说明
第1幅画搭配第3个画框,第2幅画搭配第1个画框,第3 幅画搭配第2个画框,则总体不和谐度为30
N<=70,T<=3,Aij<=200,Bij<=200
学了最小乘积生成树后发现这题很相似
只不过把生成树换成了KM
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Node
{
lol x,y;
};
Node operator -(Node u,Node v)
{
return (Node){u.x-v.x,u.y-v.y};
}
Node operator +(Node u,Node v)
{
return (Node){u.x+v.x,u.y+v.y};
}
lol operator *(Node u,Node v)
{
return u.x*v.y-u.y*v.x;
}
lol a[][],b[][],c[][];
bool vis1[],vis2[];
lol E1[],E2[],n,match[],slack[];
lol ans;
bool dfs(int x)
{int i,j;
vis1[x]=;
for (i=;i<=n;i++)
if (vis2[i]==)
{
lol gap=E1[x]+E2[i]-c[x][i];
if (gap==)
{
vis2[i]=;
if (match[i]==-||dfs(match[i]))
{
match[i]=x;
return ;
}
}
else slack[i]=min(slack[i],gap);
}
return ;
}
Node KM()
{int i,j;
lol tmp;
memset(match,-,sizeof(match));
for (i=;i<=n;i++)
{
E2[i]=;
tmp=;
for (j=;j<=n;j++)
{
if (c[i][j]>tmp) tmp=c[i][j];
}
E1[i]=tmp;
}
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
slack[j]=1e15;
while ()
{
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if (dfs(i)) break;
lol tmp=1e15;
for (j=;j<=n;j++)
if (vis2[j]==&&tmp>slack[j]) tmp=slack[j];
for (j=;j<=n;j++)
{
if (vis1[j]) E1[j]-=tmp;
if (vis2[j]) E2[j]+=tmp;
else slack[j]-=tmp;
}
}
}
lol ansa=,ansb=;
for (i=;i<=n;i++)
ansa+=a[match[i]][i],ansb+=b[match[i]][i];
return (Node){-ansa,-ansb};
}
lol cross(Node p,Node A,Node B)
{
return (A-p)*(B-p);
}
void solve(Node B,Node A)
{int i,j;
Node C;
lol x=(A.y-B.y),y=(B.x-A.x);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-a[i][j]*x-b[i][j]*y;
C=KM();
if (C.x*C.y<ans) ans=C.x*C.y;
if (cross(C,B,A)>=) return;
solve(B,C);
solve(C,A);
}
int main()
{Node A,B;
int i,j,T;
cin>>T;
while (T--)
{
cin>>n;
ans=2e9;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
scanf("%lld",&a[i][j]);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
scanf("%lld",&b[i][j]);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-b[i][j];
A=KM();
if (A.x*A.y<ans) ans=A.x*A.y;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-a[i][j];
B=KM();
if (B.x*B.y<ans) ans=B.x*B.y;
solve(B,A);
printf("%lld\n",ans);
}
}
[HNOI2014]画框的更多相关文章
- 【LG3236】[HNOI2014]画框
[LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...
- bzoj 3571: [Hnoi2014]画框
Description 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和.对于第 幅画与第 个画框的配对,小T都 ...
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- BZOJ3571 : [Hnoi2014]画框
题目是要求最小乘积最小权匹配, 将一种方案看做一个二维点(x,y),x=a值的和,y=b值的和,所有方案中只有在下凸壳上的点才有可能成为最优解 首先要求出两端的方案l,r两个点 l就是a值的和最小的方 ...
- bzoj3571: [Hnoi2014]画框 最小乘积匹配+最小乘积XX总结,
思路大概同bzoj2395(传送门:http://www.cnblogs.com/DUXT/p/5739864.html),还是将每一种匹配方案的Σai看成x,Σbi看成y,然后将每种方案转化为平面上 ...
- luogu P3236 [HNOI2014]画框
传送门 我们把一种方案的\(\sum a_{i,j}\)和\(\sum b_{i,j}\)看成点\((\sum a_{i,j},\sum b_{i,j})\),那么就只要求横纵坐标之积最小的点,类似于 ...
- 【bzoj3751】 Hnoi2014—画框
http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...
- BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3571 [题目大意] 给出一张二分图,每条边上有a,b两个值,求完美匹配, 使得suma ...
- 洛谷P3236 [HNOI2014]画框(最小乘积KM)
题面 传送门 题解 我似乎连\(KM\)都不会打啊→_→ 和bzoj2395是一样的,只不过把最小生成树换成\(KM\)了.因为\(KM\)跑的是最大权值所以取个反就行了 //minamoto #in ...
随机推荐
- Transaction 事务简单详解
Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一半就不做了,要么做完,要么就不做.也就是说,事务必须是一 ...
- Kettle 初始配置数据量类型资源库
PS:有段时间不使用Kettle了,但总遇到小伙伴问起,写一篇记录下. 文档使用版本:KETTLE 7.0 Kettle资源库可分为文件与数据库,文件型只需要配置好存放路径就行,这边介绍的是配置数据库 ...
- 【Alpha版本】冲刺阶段 - Day5 - 破浪
今日进展 袁逸灏:解决音乐播放问题以及跳转问题.(5h) 刘伟康:大致检查了测试规范,参考了其他 alpha 阶段的博客.(1h) 刘先润:解决了敌车与障碍物溢出边界的代码问题,给用户车辆增加了火焰喷 ...
- 20162327WJH第五周作业
学号 20162327 <程序设计与数据结构>第5周学习总结 教材学习内容总结 1.java是一种面向对象的语言.面向对象是一种编程方法.更是一种思维方式. 2.面向对象编程的终极目标是消 ...
- python 异步协程
"""A very simple co-routine scheduler. Note: this is written to favour simple code ov ...
- android 框架LoonAndroid,码农偷懒专用
介绍 http://www.eoeandroid.com/thread-324764-1-1.html 架构培训视频: http://pan.baidu.com/s/1mgv8HTm 简介:下载 ht ...
- Linux安装svn服务图文详解 ;出现No repository found in 'svn***问题
Linux安装svn服务 ** 示例都是用的root权限,可选择用 sudo** 1:检查 安装条件为:Linux(centos)上未安装过svn服务,若安装过或安装失败请自行删除,这里不多介绍.检查 ...
- Python——cmd调用(os.system阻塞处理)
os.system(返回值为0,1,2) 0:成功 1:失败 2:错误 os.system默认阻塞当前程序执行,在cmd命令前加入start可不阻塞当前程序执行. 例如: import os os.s ...
- Spring Boot整合Spring Security
Spring Boot对于该家族的框架支持良好,但是当中本人作为小白配置还是有一点点的小问题,这里分享一下.这个项目是使用之前发布的Spring Boot会员管理系统重新改装,将之前filter登录验 ...
- Python内置函数(34)——map
英文文档: map(function, iterable, ...) Return an iterator that applies function to every item of iterabl ...