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. Unity Svn(转)

    先吐个槽.关于这个国内各种简单到家的文章让人搞不懂,而且场景合并,prefab合并等关键问题都说没法解决,其实本质就是因为它们都是二进制文件,所以SVN没法对其合并,但事实上Unity是支持把这些文件 ...

  2. C#记录程序耗时的方法

    用于准确测量运行时间的方法类: System.Diagnostics.Stopwatch 具体使用方法: using System.Diagnostics; Stopwatch stopwatch = ...

  3. nginx编译安装

    Nginx编译安装 1.nginx官网:http://wiki.nginx.org/Install下载:http://nginx.org/en/download.html 2.编译安装# wget h ...

  4. log4j.properties 配置的学习整理

    参考资料: log4j.properties:用来做什么的(日志) Log4j:由2部分组成 :loggers(记录器)            ----日志的类别 appender(输出源)     ...

  5. 资源绑定ResourceBundle

    package com.init; import java.util.ResourceBundle; public class Resources { /** * @param args */ pub ...

  6. tomcat服务重启linux

    1杀掉tomcat 进程  用ssh登陆到服务器 lsof -i:8080         //找到端口 ps -ef|grep tomcat kill -9 端口 2找到tomcat目下的start ...

  7. 【Algorithms】归并排序(merge sort)

    几个比较常见的排序算法里头,这个我是比较生疏的一个,有一天突然被问了一个问题是,归并排序最大的特点是什么,我才想起这个算法来.下午又看不进书啦,就实现一下,记下来. 归并排序采取的是分治策略,就是先将 ...

  8. video和audio

    1.video 使用: <video width="320" height="240" src="http://www.jb51.net/mov ...

  9. Java提高篇——Java实现多重继承

    多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道Java为了保证数据安全,它只允许单继承.有些时候我们会认为如果系统中需要使用多重继承往往都是糟糕的设计,这个时候我们往往需 ...

  10. 关于Js添加版本号

    背景 在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css.js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就 ...