题目背景

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]回家的路的更多相关文章

  1. P3831 [SHOI2012]回家的路

    P3831 [SHOI2012]回家的路 分层图基础题,就是建图稍有麻烦   #include<cstdio> #include<algorithm> #include< ...

  2. [SHOI2012]回家的路 最短路

    ---题面--- 题解: 吐槽:找了好久的错,换了n种方法,重构一次代码,,,, 最后发现,,, 数组开小了,其实一开始尝试开大了数组,但唯独没有尝试开大手写队列的数组.... 思路: 有两种方法,这 ...

  3. 题解 P3831 [SHOI2012]回家的路

    什么叫分层图最短路,我不会/kk 感觉自己做法和其他题解不大一样所以过来发篇题解了. 未刻意卡常拿下最优解 题目大意 就是说给你一个 \(n \times n\) 的网格图和 \(m\) 个可换乘点, ...

  4. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  5. 分层图最短路【bzoj2834】: 回家的路

    分层图最短路[bzoj2834]: 回家的路 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2834 这道题难在建边. 自己写的时候想到了 ...

  6. bzoj 2834: 回家的路

    题目 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  DCOI Logout 捐赠本站 Notice:1 ...

  7. 洛谷P3831 回家的路

    题目背景 SHOI2012 D2T1 题目描述 \(2046\) 年 \(OI\) 城的城市轨道交通建设终于全部竣工,由于前期规划周密,建成后的轨道交通网络由\(2n\)条地铁线路构成,组成了一个\( ...

  8. BZOJ.2834.回家的路(最短路Dijkstra 拆点)

    题目链接 对于相邻的.处在同在一行或一列的车站连边,然后用dis[x][0/1](或者拆点)分别表示之前是从横边还是竖边到x的,跑最短路. 我选择拆点.. //13028kb 604ms #inclu ...

  9. 解题:SHOI 2012 回家的路

    题面 完了,做的时候已经想不起来分层图这个东西了QAQ 对于这种“多种”路径加中转站的题,还有那种有若干次“特殊能力”的题,都可以考虑用分层图来做 显然只需要记录所有的中转站+起点终点,然后拆出横竖两 ...

随机推荐

  1. EF6 CodeFirst代码迁移笔记

        由于EF7只支持codefirst only.朕无奈被微软逼上了梁山学一下codefirst,就算是为明年做准备吧.写的这些网上大致都有,基本没啥 新内容, 迁移 使用自动迁移 Enable- ...

  2. 《码出高效 Java开发手册》第四章 走进JVM(未整理)

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding

  3. win10 安装oracle 11gR2_database(内附下载地址)

    前言:想要为了后续开展项目做准备,而且打算使用oracle,所以必须先安装oracle.本机 win 10 64位系统. 第一步,下载 oracle 下载地址,官网(需要登录注册): http://d ...

  4. ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别

    在ASP.NET MVC中,视图数据可以通过ViewBag.ViewData.TempData来访问,其中ViewBag 是动态类型(Dynamic),ViewData 是一个字典型的(Diction ...

  5. android chrome iframe设置src属性无法启动app

    0x01 Android Intents with Chrome Android有一个很少人知道的特性可以通过web页面发送intent来启动apps.以前通过网页启动app是通过设置iframe的s ...

  6. 阿里云短信服务Java版

    短信服务管理平台 https://dysms.console.aliyun.com/dysms.htm java短信发送API    https://help.aliyun.com/document_ ...

  7. intellij idea elixir 插件

    intellij-elixir https://github.com/KronicDeth/intellij-elixir

  8. Flutter TabBar

    先看一下Tab的构造方法: TabBar({ Key key, @required this.tabs, this.controller, this.isScrollable: false, this ...

  9. RecyclerView中notifyDataSetChanged刷新总结

    除了adapter.notifyDataSetChanged()这个方法之外,新的Adapter还提供了其他的方法,如下: public final void notifyDataSetChanged ...

  10. 禅道Bug管理工具环境搭建

    下载地址:http://sourceforge.net/projects/zentao/files/8.2/ZenTaoPMS.8.2.stable.exe/download 1.解压ZenTaoPM ...