洛谷 P1346 電車

2021-07-30 04:09:02 字數 1962 閱讀 5761

題目描述

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

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

輸入輸出格式

輸入格式:

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

3 2 1

2 2 3

2 3 1

2 1 2

輸出樣例#1:

0做法:用需要切換按鈕的次數做最短路;

**如下:

const

maxn=10000;

var a,b,n:longint;

next,d,x,y,w,ls,list:array[0..maxn] of longint;

v:array[0..maxn] of boolean;

procedure

init;

var i,q,j,k:longint;

begin

k:=0;

readln(n,a,b);

for i:=1

to n do

begin

read(q);

for j:=1

to q do

begin

inc(k);

x[k]:=i;

read(y[k]);

if j=1

then w[k]:=0

else w[k]:=1;

next[k]:=ls[x[k]];

ls[x[k]]:=k;

end;

end;

end;

procedure

spfa;

var head,tail,t,i:longint;

begin

head:=0;

tail:=1;

v[a]:=true;

list[1]:=a;

for i:=1

to n do

d[i]:=maxlongint;

d[a]:=0;

while headdo

begin

inc(head);

t:=ls[list[head]];

while t>0

dobegin

if d[x[t]]+w[t]then

begin

d[y[t]]:=d[x[t]]+w[t];

ifnot v[y[t]]

then

begin

v[y[t]]:=true;

inc(tail);

list[tail]:=y[t];

end;

end;

t:=next[t];

end;

v[list[head]]:=false;

end;

end;

begin

init;

spfa;

if d[b]=maxlongint then writeln(-1)

else writeln(d[b]);

end.

洛谷 P1346 電車

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

洛谷P1346 電車

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

P1346 電車 洛谷

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