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分割出来的两面对应的两个点跑最 ...
随机推荐
- django-debug-toolbar的配置以及使用
django-debug-toolbar django,web开中,用django-debug-toolbar来调试请求的接口,无疑是完美至极. 可能本人,见识博浅,才说完美至极, 大神,表喷,抱 ...
- js正则表达式中test,exec,match方法的区别说明
js正则表达式中test,exec,match方法的区别说明 test test 返回 Boolean,查找对应的字符串中是否存在模式.var str = "1a1b1c";var ...
- jQuery学习小结
1.jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").clic ...
- java程序的内存分配(一)
首 页 阅览室 馆友 我的图书馆 帐号 java程序的内存分配(一) 收藏 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据J ...
- 40款非常棒的 jQuery 插件和制作教程(系列一)
jQuery 在现在的 Web 开发项目中扮演着重要角色,jQuery 让网站有更好的可用性和用户体验,让访问者对网站留下非常好的印象.jQuery以其插件众多.独特.轻量以及支持大规模的网站开发闻名 ...
- jquery中利用队列依次执行动画
如果有5个隐藏的div,要让它们依次显示,通常的做法是要一个一个嵌套在回调函数里面,这样导致代码看起来非常不直观. $("#div1").slideDown(1000,functi ...
- linux利用命令重置大量密码
yum -y install expectmkpasswd -l 10 -v was | grep 'is *' >> 123.txtmkpasswd -l 10 -v logv | ...
- truffle 安装以及基本指令
1. linux下安装方式 $ npm install -g truffle 环境要求: NodeJS 5.0+ Windows,Linux,或Mac OS X 2. 创建工程: $ mkdir te ...
- The 4 Essentials of Video Content Marketing Success
https://www.entrepreneur.com/article/243208 As videos become increasingly popular, they provide the ...
- Java并发-容器
同步容器类:同步容器类包括Vector和Hashtable.这些类实现线程安全的方式是:将它们的状态封装起来,并对每个公有方法进行同步,使得每次只有一个线程可以访问容器的状态.JDK1.2之后,提供了 ...