题目

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser  DCOI Logout 捐赠本站
Notice:1:注册本OJ方式请见https://www.lydsy.com/JudgeOnline/wttl/thread.php?tid=5671 2:替用户ir1d发布如下信息,希望大家能够积极支持。 OI Wiki 致力于成为一个开放自由的 OI 知识整合站点,欢迎感兴趣的同学参与贡献 https://oi-wiki.org

2834: 回家的路

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 183  Solved: 98
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

2 1
1 2
1 1 2 2

Sample Output

5

HINT

N<=20000,M<=100000

Source

 

[Submit][Status][Discuss]

HOME Back


한국어  中文  فارسی  English  ไทย

版权所有 ©2008-2018 大视野在线测评 | 湘ICP备13009380号
Based on opensource project hustoj.

解法

分层图最短路,将横向与纵向分开即可。

但是只能存下可转移的点与起点和终点。

数据好像有点水,起点和终点好像一定可以换乘

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <vector>
#include <queue>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T&x)
{
x=;T k=;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-;c=getchar();}
while(isdigit(c)){x=x*+c-'';c=getchar();}x*=k;
}
const int maxn=+;
int n,m,s,t,ecnt[];
struct Q{
int x,y,id;
}a[maxn]; struct Edge {
int u,v,w;
Edge(int u=,int v=,int w=):u(u),v(v),w(w) {}
};
vector<Edge> edge[];
vector<int> G[maxn][];
inline void add_edge(int u,int v,int w,int id) {
edge[id].push_back(Edge(u,v,w));
edge[id].push_back(Edge(v,u,w));
ecnt[id]+=;
G[u][id].push_back(ecnt[id]-);
G[v][id].push_back(ecnt[id]-);
} priority_queue< pair<pair<int,int>,int> > q;
int dis[maxn][];
bool vis[maxn][]; inline void dij() {
del(dis,);dis[s][]=dis[s][]=;
q.push(make_pair(make_pair(,s),));
q.push(make_pair(make_pair(,s),));
while(!q.empty()) {
pair<pair<int,int>,int> Node=q.top();q.pop();
pair<int,int> node=Node.first;
int id=Node.second,u=node.second,d=-node.first;
if(vis[u][id]) continue;
vis[u][id]=;
for(int i=;i<G[u][id].size();i++) {
Edge& e=edge[id][G[u][id][i]];
int v=e.v;
if(dis[v][id]>d+e.w) {
dis[v][id]=d+e.w;
q.push(make_pair(make_pair(-dis[v][id],v),id));
}
if(dis[v][id^]>d+e.w+) {
dis[v][id^]=d+e.w+;
q.push(make_pair(make_pair(-dis[v][id^],v),id^));
}
}
}
printf("%d\n",(min(dis[m+][],dis[m+][])==INF)?-:min(dis[m+][],dis[m+][]));
} bool cmp1(Q a,Q b) {
return (a.x^b.x)?a.x<b.x:a.y<b.y;
} bool cmp2(Q a,Q b) {
return (a.y^b.y)?a.y<b.y:a.x<b.x;
} bool cmp3(Q a,Q b) {
return a.id<b.id;
} int main()
{
read(n),read(m);
for(int i=;i<=m;i++) {read(a[i].x),read(a[i].y);a[i].id=i;}
read(a[m+].x),read(a[m+].y);read(a[m+].x),read(a[m+].y);a[m+].id=m+;a[m+].id=m+;
sort(a+,a++m+,cmp1);
for(int i=;i<m+;i++) if(a[i].x==a[i+].x) add_edge(a[i].id,a[i+].id,*(a[i+].y-a[i].y),);
sort(a+,a++m+,cmp2);
for(int i=;i<m+;i++) if(a[i].y==a[i+].y) add_edge(a[i].id,a[i+].id,*(a[i+].x-a[i].x),);
s=m+;
dij();
return ;
}

bzoj 2834: 回家的路的更多相关文章

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

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

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

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

  3. BZOJ 2834: 回家的路 Dijkstra

    按照横,竖为方向跑一个最短路即可,算是水题~ #include <bits/stdc++.h> #define N 200005 #define E 2000000 #define set ...

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

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

  5. P3831 [SHOI2012]回家的路

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

  6. [SHOI2012]回家的路

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

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

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

  8. 洛谷P3831 回家的路

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

  9. 解题:SHOI 2012 回家的路

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

随机推荐

  1. HDU 5358(2015多校联合训练赛第六场1006) First One (区间合并+常数优化)

    pid=5358">HDU 5358 题意: 求∑​i=1​n​​∑​j=i​n​​(⌊log​2​​S(i,j)⌋+1)∗(i+j). 思路: S(i,j) < 10^10 & ...

  2. 【iOS开发系列】九宫格布局

    /** * 这个尽管非常easy,算是一个小技巧,可是碰到了就记录下来吧.积跬步,致千里嘛. */ - (void)scratchableLatex { for (int i=0; i<9; i ...

  3. 11153 kill boss

    11153 kill boss 时间限制:1000MS  内存限制:65535K提交次数:1090 通过次数:340 题型: 编程题   语言: G++;GCC Description Acmer最近 ...

  4. Linux黑洞

    1 什么是Linux黑洞 在Linux系统中,/dev/null是一个虚设的设备.俗称"Linux黑洞". 不论什么对/dev/null的写入都会成功.但数据会消失得无影无踪.没有 ...

  5. Online Object Tracking: A Benchmark 论文笔记

    Factors that affect the performance of a tracing algorithm 1 Illumination variation 2 Occlusion 3 Ba ...

  6. php obstart

    PHP ob_start() 函数介绍 2010-03-29 php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数. ob_start([string output_ ...

  7. 最详细的CentOS 6与7对比(三):性能测试对比

    本主题将从3个角度进行对比 常见设置(CentOS 6 vs CentOS 7) 服务管理(Sysvinit vs Upstart vs Systemd) 性能测试(cpu/mem/io/oltp) ...

  8. ORA-03137 - ORA-12592 TNS:BAD PACKET OR ORA-3137 故障处理

    环境 操作系统:CentOS release 6.8 数据库:oracle 11.2.0.4.190115 说明:数据库psu 为19年1月份的补丁,可不间断运行,但是开发提示在执行一些批处理的时候, ...

  9. BZOJ 1485 卡特兰数 数学

    思路: 通过打表观察 这是个卡特兰数 但是它mod的数不是质数 怎么办呢 把所有数分解质因数好了 线性筛出mindiv  顺着mindiv分解质因数 复杂度$O(nlogn)$ //By Sirius ...

  10. Codeforces Round #446

    Greed #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector&g ...