470. [NOI2010]海拔

★★★☆   输入文件:altitude.in   输出文件:altitude.out   简单对比
时间限制:2 s  
内存限制:512 MB

海拔

【问题描述】

  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想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡消耗的总体力和的最小值。

【输入格式】

  第一行包含一个整数n,含义如上文所示。

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

【输出格式】

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

【样例输入】

1

1

2

3

4

5

6

7

8

【样例输出】

3

【样例说明】

  样例数据见下图。

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

【数据规模】

  对于20%的数据:n ≤ 3;

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

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

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

【提示】

  海拔高度不一定是整数。

【运行时限】

  2秒。

【运行空限】

  512M。

  
  这道题转换成对偶图,跑迪杰斯特拉+heap(不知为啥,spfa+slf优化不能过)。

  

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
const int maxm=;
int cnt,fir[maxn],nxt[maxm],to[maxm],val[maxm];
void addedge(int a,int b,int d){
nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;val[cnt]=d;
}
int S,T,n;
int dis[maxn];
struct Data{
int dis,node;
};
struct Node{
Data heap[maxn];
int cnt;
void Insert(Data x){
int p=++cnt;
while(p!=){
if(heap[p>>].dis<=x.dis)break;
heap[p]=heap[p>>];
p>>=;
}
heap[p]=x;
}
void Delete(){
int p=,a,b;
Data x=heap[cnt--];
while(p*<=cnt){
a=p<<;b=a|;
if(b>cnt||heap[b].dis>heap[a].dis)b=a;
if(heap[b].dis>=x.dis)break;
heap[p]=heap[b];
p=b;
}
heap[p]=x;
}
}q; int Solve(){
memset(dis,,sizeof(dis));
dis[S]=;q.Insert((Data){dis[S],S});
while(true){
int node=q.heap[].node;q.Delete();
if(node==T)break;
for(int i=fir[node];i;i=nxt[i])
if(dis[to[i]]>dis[node]+val[i]){
dis[to[i]]=dis[node]+val[i];
q.Insert((Data){dis[to[i]],to[i]});
}
}
return dis[T];
} int main(){
freopen("altitude.in","r",stdin);
freopen("altitude.out","w",stdout);
scanf("%d",&n);
S=;T=n*n+;
int a,b,d;
for(int i=;i<=n+;i++)
for(int j=;j<=n;j++){
scanf("%d",&d);
a=i==n+?S:(i-)*n+j;
b=i==?T:(i-)*n+j;
addedge(a,b,d);
} for(int i=;i<=n;i++)
for(int j=;j<=n+;j++){
scanf("%d",&d);
a=j==?S:(i-)*n+j-;
b=j==n+?T:(i-)*n+j;
addedge(a,b,d);
} for(int i=;i<=n+;i++)
for(int j=;j<=n;j++){
scanf("%d",&d);
a=i==n+?S:(i-)*n+j;
b=i==?T:(i-)*n+j;
addedge(b,a,d);
} for(int i=;i<=n;i++)
for(int j=;j<=n+;j++){
scanf("%d",&d);
a=j==?S:(i-)*n+j-;
b=j==n+?T:(i-)*n+j;
addedge(b,a,d);
} printf("%d\n",Solve());
return ;
}

图论(对偶图):COGS 470. [NOI2010]海拔的更多相关文章

  1. B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij

    B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...

  2. luogu2046[NOI2010]海拔 对偶图优化

    luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...

  3. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

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

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

  5. BZOJ 2007: [Noi2010]海拔

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

  6. NOI2010海拔

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

  7. Bzoj2007 [Noi2010]海拔(平面图最短路)

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

  8. 2007: [Noi2010]海拔

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

  9. bzoj2007 NOI2010 海拔(对偶图)

    80分(最小割)思路 先考虑如果没有题目中东南角为\(1\)那个限制的话会怎样. 那么只要让每个点的海拔都是\(0\)就行了.这样不论怎样走,最后的答案都是0. 然后再考虑那个东南角为\(1\)的限制 ...

随机推荐

  1. 重新看php数组

    闲来有空,最近看php手册数组这块,对于array_values() 还是第一次接触,array_values是不保留键名,只有键值的函数,还有一个作用就是  重新索引. unset() 函数,是删除 ...

  2. IE兼容问题

    1.IE下event事件没有target属性,只有srcElement属性,解决方法:使用srcObj = event.srcElement ? event.srcElement : event.ta ...

  3. 怎么让自己的java系统使用支付接口

    昨天花了好久的时间学习了支付接口的教,我看了前7集,就够用了,大家上网搜索一下传智播客在线支付还不错. 1.一开始有一个form表单 2.这个表单是他帮你写好的,有很多银行,银行的name都是特定的 ...

  4. HTML - 键盘事件

    Keyboard 事件 onkeydown: 在用户按下按键时触发. onkeypress: 在用户敲击按钮时触发. onkeyup: 当用户释放按键时触发. 示例 <!DOCTYPE html ...

  5. 【原】ios tableViewCell 自适应高度

    原文:http://www.cnblogs.com/A--G/p/4819051.html 前言:之前在做一个类似微博的小需求时候,用table view实现了微博文字和图片等等的基本展示,由于文字和 ...

  6. const和volatile的区别

    一.关键字const有什么含意? 只要一听到说:“const意味着常数”,就知道我正在和一个业余者打交道.去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embe ...

  7. 文字排版--下划线(text-decoration:underline)

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  8. Spring MVC中 controller方法返回值

    1.返回ModelAndView 定义ModelAndView对象并返回,对象中可添加model数据.指定view 2.返回String 1.表示返回逻辑视图名 model对象通过 model.add ...

  9. mysql更新密码为空

    1.进入命令行 mysql -u root -p 'oldpassword'; 2 修改root用户的密码:mysql> update mysql.user set password=PASSW ...

  10. QTP10破解

    1. 下载QTP10.0版本 http://h30302.www3.hp.com/prdownloads/T6510-15063.zip?ordernumber=380454070&itemi ...