洛谷P1346 電車 SPFA

2021-09-11 11:23:58 字數 1485 閱讀 5848

>description

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

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

>input

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

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

>output

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

>sample input

3 2 1

2 2 3

2 3 1

2 1 2

>sample output

0>解題思路

spfa模板題。

按照題目描述的那樣,既然已給出了連線的車站的數量,那麼就不用領接表這麼麻煩了。

f[x][y]儲存的是權值,第x個車站到它直接相連的第y個車站,如果y是預設開關(第乙個數)就把權值設定為0(不用下車修改開關),否則為1。

>**

#include

#include

#include

using namespace std;

int n,aa,bb,a[

105]

[105

],c[

105]

,st[

305]

,head,tail;

bool yy[

105]

,f[105][

105]

;int main()

memset

(c,0x7f

,sizeof

(c))

; c[aa]=0

; head=

0; tail=

1; st[1]

=aa;do}

yy[st[head]]=

0;}while

(head(c[bb]

!=c[0]

)printf

("%d"

,c[bb]);

else

printf

("-1");

return0;

}

洛谷P1346 電車(spfa)

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

SPFA 洛谷 P1346 電車

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

洛谷 P1346 電車

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