洛谷1346 電車 最短路

2021-07-28 21:04:31 字數 1851 閱讀 7053

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

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

輸入格式:

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

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

輸出格式:

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

題解:最短路水題。第一條軌道連一條權值為0的邊,其餘連權值為1的邊。單向邊!單向邊!單向邊!

const

maxn=3000;

maxm=10000;

var edge:array[1..maxm,1..3]of longint;

last,next:array[0..maxm]of longint;

dis,f:array[1..maxn]of longint;

state:array[1..100000]of longint;

n,m,s,t,sum:longint;

procedure add(x,y,z:longint);

begin

inc(sum);

edge[sum,1]:=x;edge[sum,2]:=y;edge[sum,3]:=z;

next[sum]:=last[x];

last[x]:=sum;

end;

procedure init;

var i,x,y,z,j:longint;

begin

readln(n,s,t);

for i:=1 to n do

begin

read(m);

for j:=1 to m do

begin

read(x);

if j=1 then

begin

add(i,x,0);

endelse

begin

add(i,x,1);

end;

end;

readln;

end;

fillchar(dis,sizeof(dis),$7f);

end;

procedure spfa(x:longint);

var head,tail,now,py:longint;

i:longint;

begin

head:=0;tail:=1;

state[1]:=x;f[x]:=1;dis[x]:=0;

repeat

inc(head);

now:=state[head];

i:=last[now];

while i<>0 do

begin

py:=edge[i,2];

if dis[now]+edge[i,3]=tail;

end;

begin

init;

spfa(s);

if dis[t]>1000000 then writeln(-1) else

writeln(dis[t]);

end.

電車 洛谷1346 最短路

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

洛谷P1346 電車(最短路)

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

洛谷P1346 電車 最短路 Floyed

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