[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 对于这种“多种”路径加中转站的题,还有那种有若干次“特殊能力”的题,都可以考虑用分层图来做 显然只需要记录所有的中转站+起点终点,然后拆出横竖两 ...
随机推荐
- EF6 CodeFirst代码迁移笔记
由于EF7只支持codefirst only.朕无奈被微软逼上了梁山学一下codefirst,就算是为明年做准备吧.写的这些网上大致都有,基本没啥 新内容, 迁移 使用自动迁移 Enable- ...
- 《码出高效 Java开发手册》第四章 走进JVM(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- win10 安装oracle 11gR2_database(内附下载地址)
前言:想要为了后续开展项目做准备,而且打算使用oracle,所以必须先安装oracle.本机 win 10 64位系统. 第一步,下载 oracle 下载地址,官网(需要登录注册): http://d ...
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
在ASP.NET MVC中,视图数据可以通过ViewBag.ViewData.TempData来访问,其中ViewBag 是动态类型(Dynamic),ViewData 是一个字典型的(Diction ...
- android chrome iframe设置src属性无法启动app
0x01 Android Intents with Chrome Android有一个很少人知道的特性可以通过web页面发送intent来启动apps.以前通过网页启动app是通过设置iframe的s ...
- 阿里云短信服务Java版
短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm java短信发送API https://help.aliyun.com/document_ ...
- intellij idea elixir 插件
intellij-elixir https://github.com/KronicDeth/intellij-elixir
- Flutter TabBar
先看一下Tab的构造方法: TabBar({ Key key, @required this.tabs, this.controller, this.isScrollable: false, this ...
- RecyclerView中notifyDataSetChanged刷新总结
除了adapter.notifyDataSetChanged()这个方法之外,新的Adapter还提供了其他的方法,如下: public final void notifyDataSetChanged ...
- 禅道Bug管理工具环境搭建
下载地址:http://sourceforge.net/projects/zentao/files/8.2/ZenTaoPMS.8.2.stable.exe/download 1.解压ZenTaoPM ...