Description

YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路。 小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,YT市市民认为爬坡是一件非常累的事情,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。因此如果一段道路的终点海拔减去起点海拔的值为h(注意h可能是负数),那么一个人经过这段路所消耗的体力是max{0, h}(这里max{a, b}表示取a, b两个值中的较大值)。 小Z还测量得到这个城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知。小Z想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡所消耗的总体力和的最小值。
Input

第一行包含一个整数n,含义如上文所示。 接下来4n(n + 1)行,每行包含一个非负整数分别表示每一条道路每一个方向的人流量信息。输入顺序:n(n + 1)个数表示所有从西到东方向的人流量,然后n(n + 1)个数表示所有从北到南方向的人流量,n(n + 1)个数表示所有从东到西方向的人流量,最后是n(n + 1)个数表示所有从南到北方向的人流量。对于每一个方向,输入顺序按照起点由北向南,若南北方向相同时由西到东的顺序给出(参见样例输入)。
Output

仅包含一个数,表示在最理想情况下每天上班高峰期间所有人爬坡所消耗的总体力和(即总体力和的最小值),结果四舍五入到整数。
Sample Input
1

1

2

3

4

5

6

7

8

Sample Output
3

【样例说明】
样例数据见下图。

最理想情况下所有点的海拔如上图所示。

【数据规模】
对于20%的数据:n ≤ 3;

对于50%的数据:n ≤ 15;

对于80%的数据:n ≤ 40;

对于100%的数据:1 ≤ n ≤ 500,0 ≤ 流量 ≤ 1,000,000且所有流量均为整数。

一不小心就看到了是最小割233,然后就想到了最小割构图

因为左上角是0右下角是1,所以我们海拔肯定是0或者1,于是最小割就很明显了,就是他给你的这张图,左上角为源右下角为汇

数据太大所以我们又只能换成对偶图最短路了,可以参考bzoj1001狼与兔子,不过那是无向图,这个是有向图

于是右→下,下→左,左→上,上→右(还成环了233),跑一遍右上到左下的最短路就行了,直接SPFA有两个点过不去,所以我加了heap

 const
maxn=;
inf=;
var
first:array[..maxn*maxn]of longint;
next,last,w:array[..maxn*maxn*]of longint;
n,tot:longint; function calc(x,y:longint):longint;
begin
if (x=) or (y=n+) then exit();
if (x=n+) or (y=) then exit(n*n+);
exit((x-)*n+y);
end; procedure insert(x,y:longint);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; var
q,h,dis:array[..maxn*maxn]of longint;
flag:array[..maxn*maxn]of boolean;
r:longint; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure up(x:longint);
var
i:longint;
begin
while x> do
begin
i:=x>>;
if dis[q[x]]<dis[q[i]] then
begin
swap(q[x],q[i]);
h[q[x]]:=x;h[q[i]]:=i;
x:=i;
end
else exit;
end;
end; procedure down(x:longint);
var
i:longint;
begin
i:=x<<;
while i<=r do
begin
if (i<r) and (dis[q[i+]]<dis[q[i]]) then inc(i);
if dis[q[i]]<dis[q[x]] then
begin
swap(q[i],q[x]);
h[q[x]]:=x;h[q[i]]:=i;
x:=i;i:=x<<;
end
else exit;
end;
end; procedure delete;
begin
swap(q[],q[r]);
h[q[]]:=;
dec(r);
down();
end; procedure spfa;
var
i:longint;
begin
r:=;q[]:=;flag[]:=true;h[]:=;
for i:= to n*n+ do dis[i]:=inf;
while r> do
begin
if q[]=n*n+ then break;
i:=first[q[]];
while i<> do
begin
if dis[q[]]+w[i]<dis[last[i]] then
begin
if not flag[last[i]] then
begin
inc(r);q[r]:=last[i];h[last[i]]:=r;
flag[last[i]]:=true;
end;
dis[last[i]]:=dis[q[]]+w[i];up(h[last[i]]);
end;
i:=next[i];
end;
flag[q[]]:=false;delete;
end;
end; procedure main;
var
i,j:longint;
begin
read(n);
for i:= to *n*(n+) do read(w[i]);
for i:= to n do
for j:= to n do
insert(calc(i,j),calc(i+,j));
for i:= to n do
for j:= to n do
insert(calc(i,j+),calc(i,j));
for i:= to n do
for j:= to n do
insert(calc(i+,j),calc(i,j));
for i:= to n do
for j:= to n do
insert(calc(i,j),calc(i,j+));
spfa;
writeln(dis[n*n+]);
end; begin
main;
end.

2007: [Noi2010]海拔 - BZOJ的更多相关文章

  1. BZOJ 2007: [Noi2010]海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2410  Solved: 1142[Submit][Status] ...

  2. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

  3. 2007: [Noi2010]海拔

    2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...

  4. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

  5. BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)

    题目链接 想一下能猜出,最优解中海拔只有0和1,且海拔相同的点都在且只在1个连通块中. 这就是个平面图最小割.也可以转必须转对偶图最短路,不然只能T到90分了..边的方向看着定就行. 不能忽略回去的边 ...

  6. bzoj 2007 [Noi2010]海拔——最小割转最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2007 一个点的高度一定不是0就是1.答案一定形如一个左上角的连通块全是0的点.一个右下角的连 ...

  7. 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)

    题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...

  8. bzoj 2007: [Noi2010]海拔【最小割+dijskstra】

    上来就跑3e5的最大流--脑子抽了 很容易看出,每个地方的海拔都是0或1因为再高了没有意义,又,上去下来再上去没有意义,所以最后一定是从s连着一片0,剩下连着t一片1,然后有贡献的就是01交接的那些边 ...

  9. NOI2010海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1302  Solved: 612[Submit][Status] ...

随机推荐

  1. 使用strtotime和mktime时参数为0时返回1999-11-30的时间戳问题

    先看例子 代码如下 复制代码 <?php $time = date('Y-m-d',strtotime('00-00-00 00:00:00')); echo $time; //输出 1999- ...

  2. c#的DateTime.Now函数详解

    //2008年4月24日System.DateTime.Now.ToString("D");//2008-4-24System.DateTime.Now.ToString(&quo ...

  3. Objective-C中的封装、继承、多态、分类

    封装的好处: 过滤不合理的值 屏蔽内部的赋值过程 让外界不必关注内部的细节 继承的好处: 不改变原来模型的基础上,拓充方法 建立了类与类之间的联系 抽取了公共代码 坏处:耦合性强(当去掉一个父类,子类 ...

  4. C# 上传图片前判断上传图片的宽和高

    网上找了好久没有找到... 最后百度到了这句话“由上传的HttpPostFile的InputStream创建一个Image对象,然后想怎么处置就随便你了”. HTML代码: <asp:FileU ...

  5. C#中多线程的简单应用

    下面是C#中使用多线程的一个简单用法介绍: //主线程: Thread thread = new Thread(new ThreadStart(ReadExportData));//创建分支线程thr ...

  6. 理解C#系列 / C#语言的特性

    C#语言的特性 大多数语句都已(;)结尾 用({})定义语句块 单行注释(//),多行注释(/*......*/)智能注释(///) 区分大小写 用namespace名称空间对类进行分类 在C#中的所 ...

  7. mysql之触发器trigger(1)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  8. Linux platform设备简介

    Technorati 标签: Linux platform     Linux在2.6内核中,针对一系列设备驱动,提供新的管理框架,成为platform机制,推出的目的,在于隔离驱动的资源和实现,使得 ...

  9. <Linux系统hostname命令详解>

    hostname命令的用法的小知识我们都知道hostname命令是查看主机名和修改主机名的. [root@apache ~]# hostname  //查看本机的主机名apache.example.c ...

  10. CentOS学习笔记--程序管理

    程序管理 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process).程序是操作系统上非常重要的概念, 所有系统上面跑的数据都会以程序的型态存在.那么系统的程序有哪些状态?不同 ...