bzoj3571
同样的最小乘积XXX模型,这里显然是二分图带权匹配
我不会写KM……于是写了个费用流,由于是稠密图,会退化到n^4
然后本地跑了56s,交上去过了………………一定是我电脑太慢……
改天写个KM吧
const inf=*;
type node=record
po,next,flow,cost:longint;
end;
point=record
x,y:longint;
end; var e:array[..] of node;
ma,pre,cur,p,d:array[..] of longint;
v:array[..] of boolean;
a,b,c:array[..,..] of longint;
q:array[..] of longint;
j,len,i,tt,t,n,ans:longint;
p1,p2:point; procedure add(x,y,f,c:longint);
begin
inc(len);
e[len].po:=y;
e[len].flow:=f;
e[len].cost:=c;
e[len].next:=p[x];
p[x]:=len;
end; procedure build(x,y,f,c:longint);
begin
add(x,y,f,c);
add(y,x,,-c);
end; function spfa:boolean;
var f,r,x,y,i,j:longint;
begin
fillchar(v,sizeof(v),false);
for i:= to t do
d[i]:=inf;
d[]:=;
f:=;
r:=;
q[]:=;
while f<=r do
begin
x:=q[f];
v[x]:=false;
i:=p[x];
while i<>- do
begin
y:=e[i].po;
if e[i].flow> then
if d[x]+e[i].cost<d[y] then
begin
d[y]:=d[x]+e[i].cost;
cur[y]:=i;
pre[y]:=x;
if not v[y] then
begin
inc(r);
q[r]:=y;
v[y]:=true;
end;
end;
i:=e[i].next;
end;
inc(f);
end;
if d[t]=inf then exit(false) else exit(true);
end; procedure change(j:longint);
begin
dec(e[j].flow);
inc(e[j xor ].flow);
end; function get:point;
var i,j,x,y:longint;
begin
len:=-;
fillchar(p,sizeof(p),);
for i:= to n do
begin
build(,i,,);
build(i+n,t,,);
end;
x:=; y:=;
for i:= to n do
for j:= to n do
begin
build(i,j+n,,c[i,j]);
if c[i,j]<c[x,y] then
begin
x:=i;
y:=j;
end;
end;
ma[y+n]:=x;
i:=p[x];
while i<>- do
begin
if (e[i].po=y+n) then change(i);
if e[i].po= then change(i xor );
i:=e[i].next;
end;
i:=p[y+n];
while i<>- do
begin
if e[i].po=t then
begin
change(i);
break;
end;
i:=e[i].next;
end;
while spfa do
begin
i:=t;
while i<> do
begin
j:=cur[i];
change(j);
if (i>n) and (i<>t) then
ma[i]:=pre[i];
i:=pre[i];
end;
end;
get.x:=; get.y:=;
for i:= to n do
begin
j:=ma[i+n];
// write(j,' ');
inc(get.x,a[j,i]);
inc(get.y,b[j,i]);
end;
// writeln;
if get.x*get.y<ans then ans:=get.x*get.y;
end; function cross(a,b,c:point):longint;
begin
exit((a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x));
end; procedure work(p1,p2:point);
var p:point;
i,j:longint;
begin
for i:= to n do
for j:= to n do
c[i,j]:=a[i,j]*(p1.y-p2.y)+b[i,j]*(p2.x-p1.x);
p:=get;
if cross(p2,p,p1)>= then exit;
work(p1,p);
work(p,p2);
end; begin
readln(tt);
while tt> do
begin
dec(tt);
readln(n);
t:=*n+;
for i:= to n do
for j:= to n do
read(a[i,j]);
for i:= to n do
for j:= to n do
read(b[i,j]);
for i:= to n do
for j:= to n do
c[i,j]:=a[i,j];
ans:=*;
p1:=get;
for i:= to n do
for j:= to n do
c[i,j]:=b[i,j];
p2:=get;
work(p1,p2);
writeln(ans);
end;
end.
bzoj3571的更多相关文章
- bzoj3571————2016——3——12(最小乘积匹配)
bzoj3571 传送门http://www.lydsy.com/JudgeOnline/problem.php?id=3571 题解: ——————来自伟大的thy大神 http://blog.c ...
- BZOJ3571 [Hnoi2014]画框 【分治 + KM算法】
题目链接 BZOJ3571 题解 如果知道最小乘积生成树,那么这种双权值乘积最小就是裸题了 将两权值和作为坐标,转化为二维坐标系下凸包上的点,然后不断划分分治就好了 这里求的是最小匹配值,每次找点套一 ...
- 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,然后将每种方案转化为平面上 ...
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- 【挖坑】thusc前一周计划2016.5.30-2016.6.3
首先开了徐姥爷blog&&AC记录里的几题,然后还有几个算法&&模板题要搞掉. 今天&&明天: bzoj3571/3083/2752/2727/2728 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- 【bzoj3751】 Hnoi2014—画框
http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...
- HNOI2014
本蒟蒻到现在才把$HNOI2014$的坑填完... $AFO$之后码力急速下降... 感觉都没有码力了... 附上题解: $DAY1$: $T1$: BZOJ3571: [Hnoi2014]画框 $T ...
随机推荐
- C语言基础:两个变量交换值的方法
学习任何语言基础时,两个数值得交换是必须掌握的,下面是3种不同的方式(c语言) 方法一:利用数学的计算技巧 #include <stdio.h> int main() { , b = ; ...
- 在唯一密钥属性“value”设置为“Default.aspx”时,无法添加类型为“add”的重复集合项
环境:windows server 2012 asp.net 找到网站目录:wwwroot ,打开web.config文件,在 在<files>与</files>之间加入代码 ...
- Android journey 2 @Android系统框架
此刻,本人还是一个android菜鸟,刚刚开始起步学习android相关知识,想用blog记录自己学习的过程,一方面给他人提供帮助,另一方面给自己个复习的地方. 在一起学习Android之前,先跟大家 ...
- 谈谈Android系统启动时的那点事儿
Android系统完整的启动过程,从系统层次角度可分为Linux系统层.Android系统服务层.Zygote进程模型三个阶段:从开机到启动Home Launcher完成具体的任务细节可分为七个步骤, ...
- BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1051 题解: 强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问 ...
- oracle时间处理
一.当前时间 在sql中直接使用sysdate函数,表示当前时间. 那么,利用当前时间,我们可以获取到当前时间前后指定的时间信息. 1.1 加减法 :: ::40select sysdate-1/24 ...
- [转载]GDI+中发生一般性错误
注:第一次写博客,把自己遇到的问题和收集的资料记录在博客上.在开发.NET应用中,使用 System.Drawing.Image.Save 方法而导致“GDI+ 中发生一般性错误”的发生,通常有以下三 ...
- [转载]C#获取本机IPv4地址
C#获取本机IP地址在C#1.0之后都使用下面的这种形式: IPHostEntry ipe = Dns.GetHostEntry(Dns.GetHostName()); IPAddress ipa=i ...
- 【Android自学之旅】 目录
[Android自学之旅] 目录 [Android自学之旅] Android开发环境的搭建
- 实战案例--Grunt构建Web程序
GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...