图论(对偶图):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\)的限制 ...
随机推荐
- junit 测试注解
* @Test: 将一个 普通的方法修饰成为一个测试方法* @BeforeClass: 他会在所有的方法运行前被执行,static修饰* @AfterClass 他会在所有方法运行结束后被执行,sta ...
- 单例模式,多种实现方式JAVA
转载请注明出处:http://cantellow.iteye.com/blog/838473 第一种(懒汉,线程不安全): public class Singleton { private stati ...
- GridView 无数据时,绑定提示
private void BindData() { DataTable dt = DAO.RunSQLReturnDt(this.getsql()); int dtcount = dt.Rows.Co ...
- vs2010 web 发布
1.在服务器上安装web deploy,这时iis中右侧功能中就多了“导入应用程序” 2.在代码的项目中,点击项目属性,将debug改为release,选择对应的平台.目标平台,主要用来区分32位还是 ...
- Visual C#实现Windows信使服务
现在有很多网络管理软件都具备网络上信息实时传送的功能,虽然有些网络通讯软件功能比较强大,有的软件不仅可以传送文本信息,还可以传送二进制文件等.但 它们都有一个无法克服的缺点,那就是分发比较困难,信息传 ...
- 在treeview外加一个滚动条的实现
前台代码: <div style="overflow:auto;width:190px;height:280px;border:1px solid #336699;padding-le ...
- 关于cocoapods和swift中使用oc第三方
mac 系统自带ruby,使用cocoapods,直接安装cocoapods就行 终端:$ sudo gem install cocoapods {安装较慢是因为有墙,查看ruby镜像列表:$ gem ...
- Codeforces 527E Data Center Drama(欧拉回路)
题意: 给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数. Solution: 题目很长,并且很多条件说的不太直接,确实不太好懂. 首先先看得到的无向图, ...
- mysql如何将一个表导出为excel表格
方法一:进入到mysql的控制台,输入: 1. SELECT * INTO OUTFILE ‘./test.xls‘ FROM tb1 WHERE 1 ORDER BY id DESC LIMIT ...
- 算法的优化(C语言描述)
算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值 ...