B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij
题意:城市被东西向和南北向的主干道划分为n×n个区域。城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路,已知每天每条道路两个方向的人流量,即沿着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。已知城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知。小Z想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡所消耗的总体力和的最小值。结果四舍五入到整数。
分析:因为城市的每个点之间都是连续的,所以不考虑0到1中的小数。
直接将地图分成海拔为0,1的两部分并不会使答案更差。此题就转化为求最小割。
然而边数有近百万,直接用dinic会炸掉。考虑转化成对偶图。
把从西向东的边看成从上到下,源点连最上最右两行。其他边同理。
连好边跑最短路,看边的数量选择堆优化Dij
代码
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#define S (n*n+1)
#define T (n*n+2)
#define p(x,y) (n*(x-1)+y)
using namespace std;
priority_queue <pair <int,int> >q;
int head[300020],to[1500010],nxt[1500010],val[1500010],cnt,n;
int dis[300020],vis[300020];
inline void add(int u,int v,int w)
{
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
val[cnt]=w;
}
inline void read(int &x)
{
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
x*=f;
}
int main()
{
read(n);
int x;
register int i,j;
for(i=0;i<=n;++i)
{
for(j=1;j<=n;++j)
{
read(x);
if(i==0)add(S,p(1,j),x);
else if(i==n)add(p(n,j),T,x);
else add(p(i,j),p(i+1,j),x);
}
}
for(i=1;i<=n;++i)
{
for(j=0;j<=n;++j)
{
read(x);
if(j==0)add(p(i,1),T,x);
else if(j==n)add(S,p(i,n),x);
else add(p(i,j+1),p(i,j),x);
}
}
for(i=0;i<=n;++i)
{
for(j=1;j<=n;++j)
{
read(x);
if(i==0)add(p(1,j),S,x);
else if(i==n)add(T,p(n,j),x);
else add(p(i+1,j),p(i,j),x);
}
}
for(i=1;i<=n;++i)
{
for(j=0;j<=n;++j)
{
read(x);
if(j==0)add(T,p(i,1),x);
else if(j==n)add(p(i,n),S,x);
else add(p(i,j),p(i,j+1),x);
}
}
for(i=0;i<=T;++i)
dis[i]=100000000;
dis[S]=0;
q.push(make_pair(-dis[S],S));
while(q.size())
{
int x=q.top().second;
q.pop();
if(vis[x])continue;
vis[x]=1;
for(i=head[x];i;i=nxt[i])
{
if(dis[to[i]]>dis[x]+val[i])
{
dis[to[i]]=dis[x]+val[i];
q.push(make_pair(-dis[to[i]],to[i]));
}
}
}
printf("%d\n",dis[T]);
}
/***************************************************************
Problem: 1897
User: 20170105
Language: C++
Result: Accepted
Time:584 ms
Memory:22164 kb
****************************************************************/
B20J_2007_[Noi2010]海拔_平面图最小割转对偶图+堆优化Dij的更多相关文章
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】
题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...
- BZOJ 2007 海拔(平面图最小割转对偶图最短路)
首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...
- bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)
bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...
- BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...
- BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路
问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...
- 【NOI2010】海拔【平面图最小割】
[问题描写叙述] YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见.能够将YT市看作 一个正方形,每个区域也可看作一个正方形.从而.YT城市中包含(n+1)×(n+ ...
- BZOJ 2007 海拔(平面图最小割-最短路)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...
- bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...
随机推荐
- spring的优缺点
它是一个开源的项目,而且目前非常活跃:它基于IoC(Inversion of Control,反向控制)和AOP的构架多层j2ee系统的框架,但它不强迫 你必须在每一层 中必须使用Spring,因为它 ...
- 与班尼特·胡迪一起攻破浮空城 (HZNU-2264)
与班尼特·胡迪一起攻破浮空城 AC Time Limit: 1 s Memory Limit: 256 MB Description 桐人为了拯救被困在浮空城堡最顶层的亚丝娜,决定从第 ...
- php能做什么
PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发. PHP能做 ...
- Pascal Triangle
Description: Given numRows, generate the first numRows of Pascal's triangle. For example, given numR ...
- 如何使用Sencha touch 构建基于Cordova的安卓项目
项目构建篇 1.生成sencha touch 项目 新建目录,在命令行进入该目录,sencha -sdk sdk-path generate app appName appPath 2.命令行中进入 ...
- flume原理
1. flume简介 flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用.Flume 初始的发行版本目前被统称为 Flume OG(original generat ...
- ORACLE 数据库选择性导出表中数据&导入已存在表数据
在dos界面下选择性导出表中的数据语句为: exp his/linker@orcl tables=(sysreprot) file="D:\20131218.dmp" query= ...
- Python进阶开发之元类编程
系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多 ...
- 第二次作业 单例模式的SessionFactory
一.基础Hibernate环境搭建(参见http://www.cnblogs.com/sangewuxie/p/9004968.html) 二.实体类User及User.hbm.xml配置 1.Use ...
- JavaScript(三、DOM文档对象模型)
一.什么是DOM DOM 是 Document Object Model(文档对象模型)的缩写. DOM 是 W3C(万维网联盟)的标准. DOM 定义了访问 HTML 和 XML 文档的标准: &q ...