洛谷P1346 電車(最短路徑問題)

2021-10-10 23:13:57 字數 1909 閱讀 9532

原題位址

一、題目內容

二、解題思路

三、注意事項

在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另乙個軌道,他就必須下車切換開關的狀態。

為了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫乙個程式,計算一輛從路口 a 到路口 b 最少需要下車切換幾次開關。

輸入格式

第一行有 3 個整數 n,a,b(2≤n≤100,1≤a,b≤n),分別表示路口的數量,和電車的起點,終點。

接下來有 n 行,每行的開頭有乙個數字 ki(0≤ki≤n−1),表示這個路口與 ki 條軌道相連,接下來有 ki 個數字表示每條軌道所通向的路口,開關預設指向第乙個數字表示的軌道。

輸出格式

輸出檔案只有乙個數字,表示從 a 到 b 所需的最少的切換開關次數,若無法從 a 前往 b,輸出 −1。

輸入輸出樣例

輸入 #1

321

2232

3121

2

輸出 #1

0
這道題用djikstra也行,用floyd也行。這道題相當於從起點走到終點,求最小總路程。其中對於每個點,如果走到的點是這個點連出的第一條邊,總路程不加;如果是其它邊,就加一。所以,在建邊前,所有邊都初始化為正無窮。因為資料不是很大,所以用floyd就行了,我習慣性用我最喜歡的暴力解法(不用怎麼動腦)

**如下:

#include

#include

#include

using namespace std;

const

int maxn=

100+10;

const

int inf=

1e+8

;//定義無窮大

int g[maxn]

[maxn]

;//地圖

int n,m,k,a,b;

intmain()

for(

int i=

1;i<=n;i++)}

for(

int k=

1;k<=n;k++

)for

(int i=

1;i<=n;i++

)for

(int j=

1;j<=n;j++

) g[i]

[j]=

min(g[i]

[j],g[i]

[k]+g[k]

[j])

;//通過中間點k求得是從i-j近還是從i-k-j近,從而求得a到b的最短路徑

if(g[a]

[b]==inf)

//沒找到

cout<<

"-1"

;else

cout<[b];

return0;

}

這道題是最短路問題,dijksra,floyd和spfa都可以解的經典題目。單單那floyd來說,這道題首先要找到核心演算法g[i][j]=min(g[i][j],g[i][k]+g[k][j]),然後想好建圖方式和判斷方法。還有乙個我們要注意的是我們建的每一條邊都只是單向邊,不要用g[i][j]=g[j][i]

蒟蒻寫得很爛而且有參考一些大佬的講解,說的不好的地方請批評指正。

洛谷P1346 電車(最短路)

在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另...

洛谷P1346 電車 最短路 Floyed

在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另...

洛谷 P1346 電車

稍微包裝過一下的最短路。如果初始狀態就是到達那個路口,就把權值搞為0,如果不是就搞為1 然後跑最短路,我用的是spfa,不過100的資料怎麼跑都行吧。include includeusing namespace std const int maxn 100 int n,a,b,k,map maxn ...