小雨坐地鐵

2021-10-05 12:05:24 字數 2194 閱讀 9304

時間限制: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...