[SHOI2012]回家的路
题目背景
SHOI2012 D2T1
题目描述
2046 年 OI 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由2n2n条地铁线路构成,组成了一个nn纵nn横的交通网。如下图所示,这2n2n条线路每条线路都包含nn个车站,而每个车站都在一组纵横线路的交汇处。
出于建设成本的考虑,并非每个车站都能够进行站内换乘,能够进行站内换乘的地铁站共有mm个,在下图中,标上方块标记的车站为换乘车站。已知地铁运行 1 站需要 2 分钟,而站内换乘需要步行 1 分钟。Serenade 想要知道,在不中途出站的前提下,他从学校回家最快需要多少时间(等车时间忽略不计)。
输入输出格式
输入格式:
第一行有两个整数n,mn,m。
接下去mm行每行两个整数x,yx,y,表示第xx条横向线路与第yy条纵向线路的交
汇站是站内换乘站。
接下去一行是四个整数x_1,y_1,x_2,y_2x1,y1,x2,y2。表示 Serenade 从学校回家时,在第 x_1x1条横向线路与第y_1y1条纵向线路的交汇站上车,在第x_2x2条横向线路与第y_2y2条纵向线路的交汇站下车。
输出格式:
输出文件只有一行,即 Serenade 在合理选择线路的情况下,回家所需要的时间。如果 Serenade 无法在不出站换乘的情况下回家,请输出-1。
说明
对于 30%的数据,n\le 50,m\le 1000n≤50,m≤1000;
对于 60%的数据,n\le 500,m\le 2000n≤500,m≤2000;
对于 100%的数据,n\le 20000,m\le 100000n≤20000,m≤100000;
对于每行每列暴力连边显然是要炸的
考虑只把相邻的点间连边,对于同行同列是没有影响的
然鹅转向就跪了
经过一番深思熟虑,我们可以把每个点拆开啊
对于每个点,横向建一个点,纵向建一个点,把这两个点间连边\(edge=1\)
然后最短路就行了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define M 1000000
#define LL long long
#define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b))
#define abs(a) ((a)>0? (a) :-(a))
using namespace std;
queue<int> q;
int i,m,n,j,k,ver[M],edge[M],head[M],nex[M],cnt,pre[M],sx,sy,ex,ey,b[M],d[M];
struct vv
{
int x,y,w;
} a[M];
void add(int x,int y,int z)
{
cnt+=1;
ver[cnt]=y, nex[cnt]=head[x], head[x]=cnt, edge[cnt]=z;
}
bool cmpx(vv a,vv b){return a.x==b.x? a.y<b.y : a.x<b.x;}
bool cmpy(vv a,vv b){return a.y==b.y? a.x<b.x : a.y<b.y;}
void spfa()
{
memset(d,0x3f,sizeof(d));
d[0]=b[0]=1;
q.push(0);
while(q.size())
{
int r=q.front(); q.pop();
b[r]=0;
for(int i=head[r];i;i=nex[i])
{
int t=ver[i];
if(d[r]+edge[i]<d[t])
{
d[t]=d[r]+edge[i];
if(!b[t]) q.push(t);
b[t]=1;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++) scanf("%d%d",&a[i].x,&a[i].y), a[i].w=i;
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
sort(a+1,a+1+m,cmpx);
for(i=2;i<=m;i++)
{
if(a[i].x==a[i-1].x) add(i,i-1,(a[i].y-a[i-1].y)*2), add(i-1,i,(a[i].y-a[i-1].y)*2);
if(a[i].x==sx) add(0,i,abs(a[i].y-sy)*2);
if(a[i].x==ex) add(i,m+1+m,abs(a[i].y-ey)*2);
}
sort(a+1,a+1+m,cmpy);
for(i=2;i<=m;i++)
{
if(a[i].x==a[i-1].x) add(i+m,i-1+m,(a[i].x-a[i-1].x)*2), add(i-1+m,i+m,(a[i].x-a[i-1].x)*2);
if(a[i].y==sy) add(0,i+m,abs(a[i].x-sx)*2);
if(a[i].y==ey) add(i+m,m+1+m,abs(a[i].x-ex)*2);
}
for(i=1;i<=m;i++) add(i,i+m,1), add(i+m,i,1);
spfa();
printf("%d",d[m+m+1]);
}
[SHOI2012]回家的路的更多相关文章
- P3831 [SHOI2012]回家的路
P3831 [SHOI2012]回家的路 分层图基础题,就是建图稍有麻烦 #include<cstdio> #include<algorithm> #include< ...
- [SHOI2012]回家的路 最短路
---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...
- 题解 P3831 [SHOI2012]回家的路
什么叫分层图最短路,我不会/kk 感觉自己做法和其他题解不大一样所以过来发篇题解了. 未刻意卡常拿下最优解 题目大意 就是说给你一个 \(n \times n\) 的网格图和 \(m\) 个可换乘点, ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- 分层图最短路【bzoj2834】: 回家的路
分层图最短路[bzoj2834]: 回家的路 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2834 这道题难在建边. 自己写的时候想到了 ...
- bzoj 2834: 回家的路
题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser DCOI Logout 捐赠本站 Notice:1 ...
- 洛谷P3831 回家的路
题目背景 SHOI2012 D2T1 题目描述 \(2046\) 年 \(OI\) 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由\(2n\)条地铁线路构成,组成了一个\( ...
- BZOJ.2834.回家的路(最短路Dijkstra 拆点)
题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...
- 解题:SHOI 2012 回家的路
题面 完了,做的时候已经想不起来分层图这个东西了QAQ 对于这种“多种”路径加中转站的题,还有那种有若干次“特殊能力”的题,都可以考虑用分层图来做 显然只需要记录所有的中转站+起点终点,然后拆出横竖两 ...
随机推荐
- VFL使用
关于界面布局约束的方法有很多,纯代码布局,可以使用官方原生布局(很繁琐).VFL.Masonary第三方等,在xib或者storyboard中也可以使用Autolayout的界面约束进行布局约束. ...
- 【原】spring redis 缓存注解使用
由于最近新上的项目很多模块没有做数据缓存,大量的请求都会到数据库去查询,为了减轻数据库的压力以及提高网站响应速度,所以在这里采用了spring 提供的注解+redis实现对数据的缓存,主要针对非热点数 ...
- Code Signal_练习题_almostIncreasingSequence
Given a sequence of integers as an array, determine whether it is possible to obtain a strictly incr ...
- IOS微信后台运行时候倒计时暂停问题
链接:https://pan.baidu.com/s/1i7cSkqL 密码:g80i 最近给央视做了个H5答题游戏,但在倒计时上遇到一个终端问题:手机端按Home键将微信收入后台之后,IOS11 会 ...
- opencv3.2.0图像处理之均值滤波blur API函数
##.均值滤波:blur函数 ##函数原型 : ,-),int borderType=BORDER_DEFAULT) (参数详解同boxFilter函数) /**********新建Qt控制台程序** ...
- Android实现不同Active页面间的跳转
Intent intent = new Intent(); intent.setClass(ErrorPageActive.this, LoginActive.class); startActivit ...
- pageHelper插件
mybatis的分页插件使用总结 环境准备工作: 1.在使用pagehelper插件时,我已经搭建好了ssm(spring+springmvc+mybatis) 在这简单描述一下ssm搭建过程 ...
- python匿名函数 高阶函数 内置函数 文件操作
1.匿名函数 匿名就是没有名字 def func(x,y,z=1): return x+y+z 匿名 lambda x,y,z=1:x+y+z #与函数有相同的作用域,但是匿名意味着引用计数为0,使用 ...
- Ubuntu16安装GPU版本TensorFlow(个人笔记本电脑)
想着开始学习tf了怎么能不用GPU,网上查了一下发现GeForce GTX确实支持GPU运算,所以就尝试部署了一下,在这里记录一下,避免大家少走弯路. 使用个人笔记本电脑thinkpadE570,内存 ...
- top,job,user,file,alias
1.系统进程 2.系统资源管理 3.作业管理 4.用户管理 5.文件权限 6.别名定义 一.系统进程 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了 ...