题目

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. [bzoj4562][Haoi2016]食物链_记忆化搜索_动态规划

    食物链 bzoj-4562 Haoi-2016 题目大意:给你n个点,m条边的DAG,求所有的满足条件的链,使得每条链的起点是一个入度为0的点,中点是一条出度为0的点. 注释:$1\le n\le 1 ...

  2. redis(四))——多实例化——实现主从配置

    引言 redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对很多其它,包含string(字符串).list(链表).set(集合)和zset(有序集合) ...

  3. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 总结

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers  总结         本章节向你介绍了SP平台上eve ...

  4. 杭电1879继续畅通project

    继续畅通project Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  5. 微软继MVC5后,出现ASP.NET VNEXT

    vNext又称MVC 6.0,不再须要依赖System.Web.占用的内存大大降低(从前不管是多么简单的一个请求.System.Web本身就要占用31KB内存). 能够self-host模式执行.站点 ...

  6. Windows下配置SVN服务器

    2013-09-03 21:40:34 1. 下载安装svn软件 1.1 服务端svn 下载地址:http://subversion.apache.org/packages.html 默认安装路径:D ...

  7. meta标签的作用及整理

    [转载] meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下 ...

  8. 函数的arguments

    1.arguments a.只能在函数内部被访问. b.arguments是一个伪数组(有下标索引,可以存放多个值,但是他里面没有数组的方法.) c.arguments里面存的是什么?函数的实际参数传 ...

  9. Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题

    error:Domain=NSOSStatusErrorDomain Code=1937337955 ,这个错误很常见, 原因是因为我们需要调用另外一个AVAudioPlayer 的初始化方法,来确定 ...

  10. SQLServer之merge函数用法

    MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; 其中最后语句分号不可以省略,且源表既可以是一个表也可 ...