原題位址
一、題目內容
二、解題思路
三、注意事項
在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另乙個軌道,他就必須下車切換開關的狀態。
為了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫乙個程式,計算一輛從路口 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 ...