ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号。 m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟(即从 ai 到 bi 需要 ti 分钟,从 bi 到 ai 也需要 ti 分钟)。
众所周知,换乘线路很麻烦。如果乘坐第 i 段地铁来到地铁站 s,又乘坐第 j 段地铁离开地铁站 s,那么需要额外花费 |ci-cj | 分钟。注意,换乘只能在地铁站内进行。
Bobo 想知道从地铁站 1 到地铁站 n 所需要花费的最小时间。
 

Input

输入包含不超过 20 组数据。
每组数据的第一行包含两个整数 n,m (2≤n≤105,1≤m≤105).
接下来 m 行的第 i 行包含四个整数 ai,bi,ci,ti (1≤ai,bi,ci≤n,1≤ti≤109).
保证存在从地铁站 1 到 n 的地铁线路(不一定直达)。
 

Output

对于每组数据,输出一个整数表示要求的值。
 
 
题解:分层图最短路。
每个地铁站按地铁线拆成若干站,这若干站之间按线号从小到大连,表示换乘地铁线。
 
 #include <bits/stdc++.h>
using namespace std;
#define gg puts("gg");
#define ll long long
#define mp make_pair
#define pii pair<int, int>
#define pli pair<ll, int>
#define fi first
#define se second
const int N = 1e5+;
const ll inf = 1e16;
int n, m, tot;
struct edge{
int to, w;
edge(int to, int w):to(to), w(w){}
edge(){}
};
struct Edge{
int f, to, w;
Edge(int f, int to, int w): f(f), to(to), w(w){}
Edge(){}
};
vector<Edge> s[N];
vector< pii > newv[N];
vector<edge> ve[N*];////
ll d[N*];
void dijsktra(int n, int s){
for(int i = ; i <= n; i++) d[i] = inf;
priority_queue< pli, vector<pli>, greater< pli > > Q;
for(int i = ; i < newv[s].size(); i++){
int u = newv[s][i].se;
d[u] = ;
Q.push( mp(, u) );
}
while(!Q.empty()){
pli f = Q.top();
Q.pop();
ll dis = f.fi;
int x = f.se;
if(d[x] < dis)
continue ;
for(int i = ; i < ve[x].size(); i++){
int to = ve[x][i].to, w = ve[x][i].w;
if(d[to] > dis+w){
d[to] = dis+w;
Q.push( mp(d[to], to) );
}
}
}
} int main(){
int u, v;
while(~scanf("%d%d", &n, &m)){
int a, b, c, t;
for(int i = ; i < m; i++){
scanf("%d%d%d%d", &a, &b, &c, &t);
s[c].push_back( Edge(a, b, t) );
} tot = ;
for(int i = ; i <= n; i++){
for(int j = ; j < s[i].size(); j++){
int u = s[i][j].f, v = s[i][j].to, w = s[i][j].w;
if(newv[u].empty()||newv[u].back().first < i) newv[u].push_back( mp(i, ++tot) );
if(newv[v].empty()||newv[v].back().first < i) newv[v].push_back( mp(i, ++tot) );
int uu = newv[u].back().se, vv = newv[v].back().se;
ve[uu].push_back( edge(vv, w) );
ve[vv].push_back( edge(uu, w) );
}
}
for(int i = ; i <= n; i++){
for(int j = ; j < newv[i].size(); j++){
int u = newv[i][j-].se, v = newv[i][j].se, w = newv[i][j].fi-newv[i][j-].fi;
ve[u].push_back( edge(v, w) );
ve[v].push_back( edge(u, w) );
}
} dijsktra(tot, );
ll ans = inf;
for(int i = ; i < newv[n].size(); i++){
int x = newv[n][i].se;
ans = min(ans, d[x]);
}
printf("%lld\n", ans); for(int i = ; i <= n; i++){
s[i].clear();
newv[i].clear();
}
for(int i = ; i <= tot; i++)
ve[i].clear();
}
return ;
}

【CSU1808】地铁的更多相关文章

  1. CSU1808 地铁 —— dijkstra变形

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 题解:由于中转线路需要花费一定的时间,所以一般的以顶点为研究对象的dijkst ...

  2. csu1808

    csu1808 题意 n 个点间有 m 条地铁,每条地铁可能属于不同的线路,每条地铁有权值即通过时花费的时间,如果乘坐第 i 条地铁来到地铁站 s,再乘坐第 j 条地铁离开,需要花费额外的时间 \(| ...

  3. 基于ionic+angulajs的混合开发实现地铁APP

    基于ionic+angulajs的混合开发实现地铁APP 注:本博文为博主原创,转载时请注明出处. 项目源码地址:https://github.com/zhangxy1035/SubwayMap 一. ...

  4. Python写地铁的到站的原理简易版

    Python地铁的到站流程及原理(个人理解) 今天坐地铁看着站牌就莫名的想如果用Python写其工作原理 是不是很简单就小试牛刀了下大佬们勿喷纯属小弟个人理解 首先来看看地铁上显示的站牌如下: 就想这 ...

  5. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  6. 假期实践作业:从IT角度看地铁

    实习时间:2016/02/23——2016/02/26 实习地点:京港地铁14号线 实习报告: 大学四年过得真快,转眼就大三了,大学前两年半的生活可谓多姿多彩,从不懂计算机到对编程感兴趣,期待得最多的 ...

  7. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  8. 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛

    传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...

  9. 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路

    1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...

随机推荐

  1. Tomcat热部署方法(3种)【转】

    热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效.但是对配置文件的修改除外! 1.直接把项目web文件夹放在webapps里. 2.在tomcat ...

  2. Multi-level Multi-select plugin

    Property file: Country[tab]City United States[tab]San Francisco United States[tab]Chicago Mexico[tab ...

  3. C# 获取DataTable数据导出到Excel

    protected void ExportExcel(System.Data.DataTable dt) { ) return; Microsoft.Office.Interop.Excel.Appl ...

  4. [转]Android View.onMeasure方法的理解

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...

  5. angularJs自定义指令.directive==类似自定义标签

    创建自定义的指令 除了 AngularJS 内置的指令外,我们还可以创建自定义指令. 你可以使用 .directive 函数来添加自定义的指令. 要调用自定义指令,HTML 元素上需要添加自定义指令名 ...

  6. 【转】PHP实现连贯操作

    [第一种方案 __call] 我们在使用一些框架(如ThinkPHP)编码的时候,常用到这样的代码. M('User')->where(array('id'=>1))->field( ...

  7. here was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

    tomcat重启后报以下错误: 09-Dec-2016 10:57:49.150 WARNING [localhost-startStop-1] org.apache.catalina.webreso ...

  8. 为Go Web App 创建一个主页面

    原文地址    大多数web app都有一个相同的布局.这个布局可能包含一个header或者footer,甚至可能包含一个导航菜单.Go的标准库提供一个简单的方式来创建这些基本元素,通过被不同的页面重 ...

  9. windows nslookup、tracert 常用命令

    nslookup www.baidu.com 可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用哪个DNS服务器进行解释. tracert www.baidu.com 路由

  10. 线性时间的排序算法--桶排序(以leetcode164. Maximum Gap为例讲解)

    前言 在比较排序的算法中,快速排序的性能最佳,时间复杂度是O(N*logN).因此,在使用比较排序时,时间复杂度的下限就是O(N*logN).而桶排序的时间复杂度是O(N+C),因为它的实现并不是基于 ...