图论(对偶图):COGS 470. [NOI2010]海拔
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]海拔的更多相关文章
- B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij 题意:城市被东西向和南北向的主干道划分为n×n个区域.城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向 ...
- luogu2046[NOI2010]海拔 对偶图优化
luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
[BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2504 Solved: 1195 Description YT市 ...
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- NOI2010海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1302 Solved: 612[Submit][Status] ...
- Bzoj2007 [Noi2010]海拔(平面图最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2742 Solved: 1318[Submit][Status] ...
- 2007: [Noi2010]海拔
2007: [Noi2010]海拔 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 分析: 平面图最小割. S在左下,T在右上,从S到T的一 ...
- bzoj2007 NOI2010 海拔(对偶图)
80分(最小割)思路 先考虑如果没有题目中东南角为\(1\)那个限制的话会怎样. 那么只要让每个点的海拔都是\(0\)就行了.这样不论怎样走,最后的答案都是0. 然后再考虑那个东南角为\(1\)的限制 ...
随机推荐
- CentOS LNMP安装phpMyAdmin
假设: 已经配置好LNMP环境,并且Nginx的网页目录在/usr/local/nginx/html 1.下载phpMyAdmin wget https://files.phpmyadmin.net/ ...
- HTTPS是如何保证连接安全:每位Web开发者都应知道的
“HTTPS协议的工作原理是什么?”这是我在数天前工作项目中需要解决的问题. 作为一名Web开发者,我当然知道 HTTPS 协议是保障用户敏感数据的好办法,但并不知道这种协议的内在工作机制. 它怎么保 ...
- 织梦dede编辑器ckeditor如何添加中文字体不乱码
dedecms内容编辑器ckeditor没有中文字体,找了很多教程都是千篇一律,而且都是错的,终于找到了一篇,结合自己的实际操作,来教您如何添加中文字体,并且解决乱码问题. 工具/原料 dedec ...
- PHP 中xampp不能启动服务器的问题
有时候别人电脑上面的XAMPP,你把安装文件拷贝下来后,会发现,自己的电脑上用不了 这个时候有很多种情况 1. 关闭你自己电脑上有可能暂用80端口的程序 2.D:\xampp\apache\conf\ ...
- RecyclerView实例-实现可下拉刷新上拉加载更多并可切换线性流和瀑布流模式(1)
摘要 最近项目有个列表页需要实现线性列表和瀑布流展示的切换,首先我想到的就是上 [RecyclerView],他本身已经很好的提供了三种布局方式,只是简单做个切换应该是很简单的事情,如果要用Recyc ...
- Asp与Asp.Net的区别
今天在网上看到一位朋友问asp与asp.net的区别.编辑本人也是从asp转型到.net来的,几年了,几乎都忘记了asp的存在,也说不出它们之间的区别,因为感觉两者是根本就没有联系,非要说有联系,那就 ...
- Business Intelligence (BI)
BI, 全称Business Inteligence. 帮助企业更有效地利用数据,提供经营决策支持.让决策管理者随时随地获取关键信息,基于数字决策,最终提高决策水平. 包括范围(层次由低到高):数据报 ...
- Vijos1386 IOI2007 矿工配餐 动态规划
感觉早些年IOI的题都不难啊,也就NOIp难度……现在貌似变难了 状态用dp[n][a1][b1][a2][b2]表示 n表示处理到前n个餐车 第一组矿工得到的最近一种食物用a1表示,a1的上一种食物 ...
- POJ刷题记录 (。・`ω´・)(Progress:6/50)
1743:前后作差可以转化成不可重叠最长公共字串问题,运用后缀数组解决(参考罗穗骞神犇的论文) #include <cstdio> #include <cstring> #in ...
- ie11下,插入框架Html
if(navigator.userAgent.indexOf("MSIE")>0 || (navigator.userAgent.indexOf("Trident& ...