Description

Input

Output

Sample Input

2 1
1 2
1 1 2 2

Sample Output

5
 
思路还是很简单的,然而最短路打错各种对拍各种调了一早上
代码:
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cstdlib>
#include<map>
#include<algorithm>
#define M 300010
using namespace std;
vector<int>S1[M],S2[M];
map<int,int>f[M];
int n,m,num,cnt,x1,x2,y1,y2;
int head[M],dis[M],vis[M],st[M],v[M];
struct point{int to,next,dis;}e[M<<];
void add(int from,int to,int dis) {
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
}
void SPFA(int s) {
memset(dis,,sizeof(dis));
queue<int>Q;dis[s]=;
Q.push(s);
while(!Q.empty()) {
int x=Q.front();Q.pop();vis[x]=false;
for(int i=head[x];i;i=e[i].next) {
int to=e[i].to;
if(dis[x]+e[i].dis<dis[to]) {
dis[to]=dis[x]+e[i].dis;
if(!vis[to]) vis[to]=true,Q.push(to);
}
}
}
}
int get(int x,int y) {
return *abs(v[st[x]]-v[st[y]]);
}
bool cmp(int x,int y) {
return v[x]<v[y];
}
int main() {
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++) {
int x,y;scanf("%d%d",&x,&y);
if(f[x][y]!=) continue;
f[x][y]=++cnt;
S1[x].push_back(cnt);v[cnt]=y;
S2[y].push_back(++cnt);v[cnt]=x;
add(cnt-,cnt,),add(cnt,cnt-,);
}
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(!f[x1][y1]) {
f[x1][y1]=++cnt;
S1[x1].push_back(cnt);v[cnt]=y1;
S2[y1].push_back(++cnt);v[cnt]=x1;
add(cnt-,cnt,),add(cnt,cnt-,);
}
else {
int t=f[x1][y1];
add(t+,t,),add(t,t+,);
}
if(!f[x2][y2]) {
f[x2][y2]=++cnt;
S1[x2].push_back(cnt);v[cnt]=y2;
S2[y2].push_back(++cnt);v[cnt]=x2;
add(cnt-,cnt,),add(cnt,cnt-,);
}
else {
int t=f[x2][y2];
add(t+,t,),add(t,t+,);
}
for(int i=;i<=(n<<);i++) {
int tmp=;
for(int j=;j<S1[i].size();j++) st[++tmp]=S1[i][j];
if(tmp>) {
sort(st+,st+tmp+,cmp);
for(int j=;j<=tmp;j++) {
add(st[j-],st[j],get(j-,j));
add(st[j],st[j-],get(j,j-));
}
}
tmp=;
for(int j=;j<S2[i].size();j++) st[++tmp]=S2[i][j];
if(tmp>) {
sort(st+,st+tmp+,cmp);
for(int j=;j<=tmp;j++) {
add(st[j-],st[j],get(j-,j));
add(st[j],st[j-],get(j,j-));
}
}
}
int s=f[x1][y1],t=f[x2][y2];
SPFA(s);
printf("%d\n",dis[t]>1e8?-:dis[t]);
return ;
}

HINT

N<=20000,M<=100000

[BZOJ2834]回家的路的更多相关文章

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

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

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

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

  3. bzoj 2834: 回家的路

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

  4. P3831 [SHOI2012]回家的路

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

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

    题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ...

  6. [SHOI2012]回家的路

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

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

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

  8. 洛谷P3831 回家的路

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

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

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

随机推荐

  1. RxJava && Agera 从源码简要分析基本调用流程(1)

    版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/123 来源:腾云阁 https://www.qclo ...

  2. VScode之JavaScript Snippet Pack

    一个片段包 使用例如: cl 回车或者tab键,就可以完整的打出console.log("") 还有很多快捷功能: 参考: https://marketplace.visualst ...

  3. CodeForces - 459E Pashmak and Graph[贪心优化dp]

    E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 自定义事件类EventManager (TS中...args的使用例子)

    一个自定义事件类 初衷是使用Egret的事件有两点比较麻烦 1   在事件处理函数时,需要从e中获取data hander(e:egret.Event){ let data = e.data; } 2 ...

  5. 聊聊对APM的理解

    本文主要从以下几个列举对APM的认识: -什么是APM工具 -为什么要用APM工具,APM工具的价值在哪里: -什么样的APM工具适合于传统金融业: -如何用好APM工具:    -精准告警    - ...

  6. 【BZOJ5100】[POI2018]Plan metra 构造

    [BZOJ5100][POI2018]Plan metra Description 有一棵n个点的无根树,每条边有一个正整数权值,表示长度,定义两点距离为在树上的最短路径的长度. 已知2到n-1每个点 ...

  7. Python 自学积累(二)

    1. onfigParser 模块用于操作配置文件 注:Parser汉译为“解析”之意. 配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数( ...

  8. nginx ---refine---按需时间/流量进行调整后台服务器---geocity,proxypass

    原理相当于配置文件在启动时进行编译,proxyPass http://mydomain/path/xxxx这种方式是编译成静态的,直接替换成它解析到的ip/vip,只有重新启动时才会重新解析. 而 s ...

  9. python之sys.stdout、sys.stdin以及设置打印到日志文件等

    转自:https://www.cnblogs.com/BigFishFly/p/6622784.html python之sys.stdout.sys.stdin 转自:http://www.cnblo ...

  10. Python开发【项目】:大型模拟战争游戏(外星人入侵)

    外星人入侵 游戏概述: 现在准备用python开始搞一个大型游戏,模拟未来战争,地球人狙击外星人大战(其实就是小蜜蜂游戏2333),玩家控制一个飞船,用子弹歼灭屏幕上空的外星飞船:项目用到了Pygam ...