【问题描写叙述】

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。

题解:首先依据调整法能够证明高度中仅仅存在0和1。而且0一定连在一起,1一定连在一起,然后就能够想到求最小割,由于数据范围比較大。我们须要转化成对偶图求最短路。另一点问题是这个图是有向图。解决办法是把每条边都逆时针转90度。

(普通spfa会超时两个点,须要使用slf优化或堆优化dijkstra)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int s,t,c,n,point[5000001],next[5000001],cnt,dis[5000001],l[50000001];
bool f[5000001];
struct use{
int st,en,val;
}b[5000001];
void add(int x,int y,int z)
{
next[++cnt]=point[x];point[x]=cnt;
b[cnt].st=x;b[cnt].en=y;b[cnt].val=z;
}
int spfa(int x,int y)
{
int h,t,u;
memset(dis,127/3,sizeof(dis));
dis[x]=0;h=0;t=1;l[t]=x;f[x]=true;
while (h<t)
{
u=l[++h];
f[u]=false;
for (int i=point[u];i;i=next[i])
if (dis[b[i].en]>dis[u]+b[i].val&&b[i].en!=u)
{
dis[b[i].en]=dis[u]+b[i].val;
if (!f[b[i].en])
{
f[b[i].en]=true;
if (dis[b[i].en]<dis[l[h+1]]) l[h--]=b[i].en;
else
l[++t]=b[i].en;
}
}
}
if (dis[y]>510000000) dis[y]=0;
return dis[y];
}
int main()
{
freopen("altitude.in","r",stdin);
freopen("altitude.out","w",stdout);
scanf("%d",&n);
s=1;t=n*n+2;
for (int i=1;i<=n+1;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&c);
if (i==1) add(j+1,t,c);
if (i==n+1) add(s,n*(n-1)+j+1,c);
if (i>1&&i<n+1) add(n*(i-1)+j+1,n*(i-2)+j+1,c);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n+1;j++)
{
scanf("%d",&c);
if (j==1) add(s,n*(i-1)+2,c);
if (j==n+1) add(n*(i-1)+n+1,t,c);
if (j>1&&j<n+1) add(n*(i-1)+j,n*(i-1)+j+1,c);
}
for (int i=1;i<=n+1;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&c);
if (i==1) add(t,j+1,c);
if (i==n+1) add(n*(n-1)+j+1,s,c);
if (i>1&&i<n+1) add(n*(i-2)+j+1,n*(i-1)+j+1,c);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n+1;j++)
{
scanf("%d",&c);
if (j==1) add(n*(i-1)+2,s,c);
if (j==n+1) add(t,n*(i-1)+n+1,c);
if (j>1&&j<n+1) add(n*(i-1)+j+1,n*(i-1)+j,c);
}
cout<<spfa(s,t);
}

【NOI2010】海拔【平面图最小割】的更多相关文章

  1. Vijos1734 NOI2010 海拔 平面图最小割

    建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...

  2. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

  3. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

  4. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  5. 洛谷P2046 [NOI2010]海拔(最小割,平面图转对偶图)

    传送门 不明白为什么大佬们一眼就看出这是最小割…… 所以总而言之这就是一个最小割我也不知道为什么 然后边数太多直接跑会炸,所以要把平面图转对偶图,然后跑一个最短路即可 至于建图……请看代码我实在无能为 ...

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

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

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

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

  8. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

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

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

  10. Luogu2046 NOI2010 海拔 平面图、最小割、最短路

    传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...

随机推荐

  1. Luogu P1541 乌龟棋(NOIP2010TG)

    自己的第一篇博文 祭一下祭一下 题目背景 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 题目描述 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点, ...

  2. 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找

    爱pia戏推出PC客户端, 可以在无法使用插件的时候,使用PC客户端, 将为您自动置顶窗口,方便查看剧本. 百度网盘下载地址: 链接: http://pan.baidu.com/s/1pLpvn5p ...

  3. Vue Elementui 如何让输入框每次自动聚焦

    在项目优化中碰到一个小问题,在每次提示框显示的时候让提示框中的输入框聚焦.如下图.一般情况下提示框是隐藏的.点击了编辑才会弹出. 那么原生属性autofocus 只在模板加载完成时起作用,也就是说只有 ...

  4. java 数据分页

    分页逻辑 import lombok.Data; /** * User eric * Date * Email yq@aso.ren */ @Data public class PageHelper ...

  5. 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

    在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲. 在开场视频中霍金又来了.你记 ...

  6. 关于c# SESSION丢失问题解决办法

    我们在用C#开发程序的时候经常会遇到Session很不稳定,老是数据丢失.下面就是Session数据丢失的解决办法希望对您有好处.1.在WEB.CONFIG文件中修改SESSION状态保存模式,如:& ...

  7. WPF 完美截图 <二>

    根据WPF 完美截图 <一>总结: 1.BitmapSource与BitmapImage及CorppedBitmap之间的转换 2.中心及边角的模板实现及其拖动 3.除了拖动矩形外区域要实 ...

  8. Winwos Server 2012发布ASP.NET MVC5 项目

    一.本文实验环境: Windows Server 2012 R2 Visual Studio 2015 项目为:ASP.NET MVC 5.0,使用的是SQL SERVER 2008 R2数据库 二. ...

  9. 来手撸一个小小小小小"3D引擎"

    开始的唠叨 说是3D引擎确实有点过于博眼球了,其实就是实现了一个透视投影,当然也不是那么简单的. 此篇文章是纯粹给小白看的 高手请勿喷 .也称之为小向带你图形学入门基础 . 哇哈哈哈哈 一说到做一个3 ...

  10. android studio 默认 .gitignore 文件模板

    # built application files*.apk*.ap_ # files for the dex VM*.dex # Java class files*.class # generate ...