[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 对于这种“多种”路径加中转站的题,还有那种有若干次“特殊能力”的题,都可以考虑用分层图来做 显然只需要记录所有的中转站+起点终点,然后拆出横竖两 ...
随机推荐
- Emgucv(一)Aforge切换摄像头并调用摄像头属性
一.新建一个Windows窗体应用程序,在Form1窗体上添加一个PictureBox控件.一个ComboBox控件,命名为PictureBox1.cbCapture,还有两个Button控件,Tex ...
- MQ疑难杂症小记
为什么使用消息队列? 什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处.消息队列的常见使用场景,其实场景有很多,但是比较核心的有3个:解耦 ...
- win8.1怎么安装iis
进入系统后,在左下角处点鼠标右键,再点击[程序和功能]如下图所示: 2 进入程序和功能界面后,点击[启用或关闭Windows功能] 在WINDOWS功能对话框中找到[internet in ...
- css-css和html的结合方式(四种结合方式)
(1)在每个HTML标签上面都有一个属性 style,把css和HTML结合在一起 <div style="background-color:red;color:blue;&quo ...
- [NodeJs] 用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库
小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢no ...
- 一步一步pwn路由器之radare2使用实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...
- Retrofit+RxJava(2)-基本使用
首先是抽象的基类 public abstract class BaseApi { public static final String API_SERVER = "服务器地址" p ...
- for循环内嵌套finally使用的意外获得
在for循环中有continue和break,无论执行continue还是break finally的逻辑都会执行,原本以为是不执行的 格式 for (int i = 0; i < 3; i ...
- ES6-fetch
fetch 事实标准,并不存在与ES6规范中,基于Promise实现. 目前项目中对Promise的兼容性尚存在问题,如果在项目中应用fetch,需要引入es6-promise和fetch. fis3 ...
- ActionContext和ServletActionContext小结(转)
ActionContext和ServletActionContext小结 1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Act ...