在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口(不排除有的觀光軌道轉一圈後返回路口的可能)。在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另乙個軌道,他就必須下車切換開關的狀態。
為了行駛向目標地點,電車司機不得不經常下車來切換開關,於是,他們想請你寫乙個程式,計算一輛從路口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做一次spfa。
**const
maxn=200;
vars,ls,next,d:array[0..maxn] of int64;
a:array[0..maxn,1..3] of longint;
x:array[0..maxn,0..maxn] of longint;
v:array[0..maxn] of boolean;
i,j,n,ans,m,n1,p,q:longint;
procedure spfa;
varhead,tail,t:longint;
begin
head:=0;
tail:=1;
for i:=1 to n do
d[i]:=maxlongint;
d[p]:=0;
v[p]:=true;
s[1]:=p;
while head0 do
begin
if d[a[t,1]]+x[a[t,1],a[t,2]]begin
d[a[t,2]]:=d[a[t,1]]+x[a[t,1],a[t,2]];
if not v[a[t,2]] then
begin
v[a[t,2]]:=true;
inc(tail);
s[tail]:=a[t,2];
end;
end;
t:=next[t];
end;
v[s[head]]:=false;
end;
end;
begin
readln(n,p,q);
for i:=1 to n do
for j:=1 to n do
x[i,j]:=maxlongint;;
for i:=1 to n do
begin
read(n1);
for j:=1 to n1 do
begin
inc(m);
a[m,1]:=i;
read(a[m,2]);
if j=1 then begin x[i,a[m,2]]:=0;end else x[i,a[m,2]]:=1;
next[m]:=ls[i];
ls[i]:=m;
end;
readln;
end;
spfa;
if d[q]=maxlongint then writeln(-1) else writeln(d[q]);
end.
SPFA 洛谷 P1346 電車
在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道出去,如果電車司機想走另...
洛谷P1346 電車 SPFA
description 在乙個神奇的小鎮上有著乙個特別的電車網路,它由一些路口和軌道組成,每個路口都連線著若干個軌道,每個軌道都通向乙個路口 不排除有的觀光軌道轉一圈後返回路口的可能 在每個路口,都有乙個開關決定著出去的軌道,每個開關都有乙個預設的狀態,每輛電車行駛到路口之後,只能從開關所指向的軌道...
洛谷 P1346 電車
稍微包裝過一下的最短路。如果初始狀態就是到達那個路口,就把權值搞為0,如果不是就搞為1 然後跑最短路,我用的是spfa,不過100的資料怎麼跑都行吧。include includeusing namespace std const int maxn 100 int n,a,b,k,map maxn ...