時間限制:c/c++ 1秒,其他語言2秒題目描述空間限制:c/c++ 524288k,其他語言1048576k
64bit io format:%lld
小雨所在的城市一共有 m 條地鐵線,分別標號為 1 號線,2 號線,……,m 號線。整個城市一共有 n 個車站,編號為 1∼n 。其中坐 i 號線需要花費 ai的**,每坐一站就需要多花費 bi的**。i 號線有 ci個車站,而且這 ci個車站都已知,如果某一站有多條地鐵線經過,則可以在這一站換乘到另一條地鐵線,並且能多次換乘。現在小雨想從第 ss 個車站坐地鐵到第 t輸入描述:個車站,地鐵等待時間忽略不計,求最少花費的**,若不能到達輸出 -1 。(地鐵是雙向的,所以 s 可能大於 t)
第一行輸入四個正整數 n,m,s,t分別表示車站個數,地鐵線數,起點站和終點站。 第二行到第 m + 1行,每行前三個數為輸出描述:ai,bi,ci,分別表示坐 i 號線的**,i 號線每坐一站多花的**,i 號線車站個數。接下來 ci個數,表示 i
號線的每乙個車站的編號,單調遞增。
共一行,乙個數表示最小花費,若不能到達輸出 -1 。
示例1輸入
521
4223
1352
1423
45
輸出
7
說明
坐 1 號線:花費 2;
1→3:花費 2;
換乘 2 號線:花費 2;
3→4:花費 1;
所以最小總花費為 7 。
題解:我也是毫無頭緒,不知道該怎麼下手做,看完別人的題解,來講講自己的理解
我們要用到分層圖
建立m+1層圖,前m層自然就是每一條的地鐵線,但地鐵線是有可能交叉的,也就是擁有共同車站,所以在第m+1層給每個車站建立乙個虛點,用於和前m層對應的車站相連,注意是建雙向邊,因為地鐵可來回,從虛點到地鐵線上需要花費,花費坐這條線的**,從地鐵線上到虛點花費為0
具體可以看看圖:
例題中求1—>4 ,
從虛點1出發,到第一條線1,花費為2,
從1再到3 花費為2
從第一條線3再到虛點3 花費為0
虛點3到第二條線3 花費為2
從第二條線3到4 花費為1
總花費為7
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e8+2;
int n,m,s,t,head[maxn]
,dis[maxn]
,ant,x;
;priority_queue
int,
int>
,vector
int,
int>
>
,greater
int,
int>
>
>q;
struct nodeedge[maxn<<1]
;void
add(
int u,
int v,
int w)
void
dijkstra
(int s)}}
}int
main()
add(x,i*n+x,a)
;//虛邊到火車站費用是做這個火車的費用
add(i*n+x,x,0)
;//火車站到虛邊費用為0
pre = x;
//存上乙個車站 }}
dijkstra
(s);
if(dis[t]
== maxn) cout<<
"-1"
;else cout<
;return0;
}
小雨坐地鐵 (分層最短路 建立虛點)
思路 建立乙個虛點層,題目等價於求虛點層起點到終點的最小花費。同一層邊花費b,虛點層到其他每層花費a。跑一邊dijkstra即可。ac include using namespace std const int n 1e6 5,inf 0x3f3f3f3f struct edgee n int h ...
python地鐵車票 小明坐地鐵python實現
題目要求 單程票價實現 dancheng.py class gongli def init self,km self.km km def each money self money 0 if self.km 0 and self.km 6 money 3 elif self.km 6 and sel...
牛客小白月賽16 小雨坐地鐵 建虛點最短路
時間限制 c c 1秒,其他語言2秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 小雨所在的城市一共有 mm 條地鐵線,分別標號為 1 號線,2 號線,m 號線。整個城市一共有 nn 個車站,編號為 1 n1 n 其中坐 i 號線需要花費 ai...