1808: 地铁
Time Limit: 5 Sec Memory Limit: 128 Mb Submitted: 1466 Solved: 350
Description
Bobo 居住在大城市 ICPCCamp。
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
对于每组数据,输出一个整数表示要求的值。
Sample Input
3 3
1 2 1 1
2 3 2 1
1 3 1 1
3 3
1 2 1 1
2 3 2 1
1 3 1 10
3 2
1 2 1 1
2 3 1 1
Sample Output
1
3
2
// 貌似是最短路模板题,但是,用点来跑最短路显然是错的,因为,每次松弛都不能记录是由哪条线路松弛的。为了知道是怎么松弛的。
我们可以用边来跑最短路,dis[i] 表示由 i 边到达 edge[i].to 点的最短路,这样可以愉快的松弛所有边了!有的大牛用了拆点的方法,就是把一个点分成多个线路的点,建图都比较难想,还是比较麻烦


1 # include2 # include 3 # include 4 # include 5 # include 6 # include 7 # include 8 # include