bzoj2007
首先不难发现海拔高度只能为0或1
因为决策是单调的
不难发现最优决策一定是划分为海拔为0和1两块,不会出现01相间的情况
所以这很明显是一个最小割
由于n*n很大,我们必须要用平面图最小割转化为最短路径
在我们做1001时,是平面无向图,这里是平面有向图,其实是一样的
只要记住以起点终点为对角线划分外面为两个面,然后以面为点,边两侧面连边
最后注意新图的任意一条路径对应原图的一个割即可
最后答案就是最短路
type node=record
loc,num:longint;
end;
cmp=record
point,next,cost:longint;
end; var edge:array[..] of cmp;
heap:array[..] of node;
p,d,where:array[..] of longint;
t,m,n,i,j,k,x,y,len:longint; procedure swap(var a,b:node);
var c:node;
begin
c:=a;
a:=b;
b:=c;
end; procedure add(x,y,z:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].cost:=z;
edge[len].next:=p[x];
p[x]:=len;
end; procedure up(i:longint);
var j,x,y:longint;
begin
j:=i shr ;
while j> do
begin
if heap[i].num<heap[j].num then
begin
x:=heap[i].loc;
y:=heap[j].loc;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=i shr ;
end
else break;
end;
end; procedure sift(i:longint);
var j,x,y:longint;
begin
j:=i shl ;
while j<=m do
begin
if (j<m) and (heap[j].num>heap[j+].num) then inc(j);
if heap[i].num>heap[j].num then
begin
x:=heap[i].loc;
y:=heap[j].loc;
where[x]:=j;
where[y]:=i;
swap(heap[i],heap[j]);
i:=j;
j:=i shl ;
end
else break;
end;
end; begin
readln(n);
fillchar(p,sizeof(p),);
t:=n*n+;
for i:= to n do
begin
readln(x);
add(,i+,x);
end;
for i:= to n do
for j:= to n do
begin
readln(x);
if i=n then y:=t
else y:=i*n+j+;
add((i-)*n+j+,y,x);
end; for i:= to n do
begin
readln(x);
add((i-)*n+,t,x);
for j:= to n do
begin
readln(x);
add((i-)*n+j+,(i-)*n+j,x);
end;
readln(x);
add(,i*n+,x);
end; for i:= to n do
begin
readln(x);
add(i+,,x);
end;
for i:= to n do
for j:= to n do
begin
readln(x);
if i=n then y:=t
else y:=i*n+j+;
add(y,(i-)*n+j+,x);
end; for i:= to n do
begin
readln(x);
add(t,(i-)*n+,x);
for j:= to n do
begin
readln(x);
add((i-)*n+j,(i-)*n+j+,x);
end;
readln(x);
add(i*n+,,x);
end;
m:=t;
for i:= to t do
begin
if i= then d[i]:=
else d[i]:=;
heap[i].loc:=i;
heap[i].num:=d[i];
where[i]:=i;
end;
for i:= to t do
begin
k:=heap[].loc;
if k=t then break;
x:=heap[m].loc;
where[x]:=;
swap(heap[],heap[m]);
dec(m);
sift();
j:=p[k];
while j<>- do
begin
y:=edge[j].point;
if d[y]>edge[j].cost+d[k] then
begin
d[y]:=edge[j].cost+d[k];
heap[where[y]].num:=d[y];
up(where[y]);
end;
j:=edge[j].next;
end;
end;
writeln(d[t]);
end.
bzoj2007的更多相关文章
- 【bzoj2007】 Noi2010—海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ...
- BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】
题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
[BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...
- 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)
[BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...
- BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...
- bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)
bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...
- BZOJ2007——[Noi2010]海拔
1.题意:一个裸的最小割 2.分析:直接转成对偶图最短路就好了,水爆了!(雾) #include <queue> #include <cstdio> #include < ...
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2095 Solved: 1002[Submit][Status] ...
- Bzoj2007 [Noi2010]海拔
Time Limit: 20 Sec Memory Limit: 552 MB Submit: 2380 Solved: 1130 Description YT市是一个规划良好的城市,城市被东西向 ...
随机推荐
- JOSN对象与JSON字符串的相互转化
前端在与服务端通信时.会与JSON JSON字符串经常打交道. 什么是JSON? 如果不太清楚可以点击这里 服务端传过来的数据一般都是一串字符串,jQuery AJAX中的success函数的第一个 ...
- step2 uboot tag存储主要部分代码
cmd_bootm.c //传递给内核的参数 int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) ...
- Asp.net简单三层+Sqllite 增删改查
新建项目à新建一个空白解决方案 在Model新建一个实体类 using System; using System.Collections.Generic; using System.Linq; usi ...
- 安卓Intent(显式)
1.Intent是Android程序中各组件之间交互的重要方式,一般可用于启动活动.启动服务.以及发送广播等场景,这里先对活动进行说明Intent的一些作用. 2.Intent的用法大致可分为,显式I ...
- react-native之站在巨人的肩膀上
react-native之站在巨人的肩膀上 前方高能,大量图片,不过你一定会很爽.如果爽到了,请告诉我
- JS1 js获取dom元素方法
js获取dom元素方法 1.通过ID选取元素(getElementById) 1)使用方法:document.getElementById("domId") 其 ...
- delphi 功能函数大全-备份用
function CheckTask(ExeFileName: string): Boolean;constPROCESS_TERMINATE=$0001;varContinueLoop: BOOL; ...
- shell脚本学习之Bash shell 里各种括号的用法
今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...
- Node之express
Express 是一个简洁.灵活的 node.js Web 应用开发框架, 它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用. 如何安装: npm install -g express ...
- 半质数的个数 csdn 英雄会 高校俱乐部
2·14 情人&元宵节专题:半质数的个数. 题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数.前几个半质数是 4, 6, 9, ...