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. 序列化(Serialization)据为JSONP远端请求

    Insus.NET前些日子,有分享了一段代码,<使用JSONP跨域请求数据>http://www.cnblogs.com/insus/p/3512271.html 是使用jQuery的Da ...

  2. play for scala 实现SessionFilter 过滤未登录用户跳转到登录页面

    一.编写SessionFilter.scala代码 package filters import javax.inject.{Inject, Singleton} import akka.stream ...

  3. C#编程之委托与事件四(二)【转】

    C#编程之委托与事件(二)       我在上一篇文章(C#编程之委托与事件(一) )中通过示例结合的方法介绍了委托,在本文中,我同样以代码示例的方式来介绍C#里的事件机制. 二.事件   1.了解概 ...

  4. ThinkPHP的缓存技术

    原文:ThinkPHP的缓存技术 如果没有缓存的网站是百万级或者千万级的访问量,会给数据库或者服务器造成很大的压力,通过缓存,大幅减少服务器和数据库的负荷.假如我们 把读取数据的过程分为三个层,第一个 ...

  5. fiddler实现手机端抓包(代理)

    一.fiddler设置代理 1.打开Fiddler->Tools->Fiddler Options在Connection面板里将 Allow remote computers to con ...

  6. IEnumerable 使用foreach 详解

    自己实现迭代器 yield的使用 怎样高性能的随机取IEnumerable中的值 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么L ...

  7. collectionView,tableView的细节处理

    1.设置collectionView的高度 1.1为什么要设置高度? collectionView是在tableView的footView里面 , tableView能滚动,collectionVie ...

  8. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  9. Leetcode: Assign Cookies

    Assume you are an awesome parent and want to give your children some cookies. But, you should give e ...

  10. Android之下载管理者

    public interface HttpDownloader { public void setDownloadManager(HttpDownloadManager manager); publi ...