您的位置:首页 > 其它

洛谷 P1346 电车

2017-03-09 16:04 218 查看
题目大意:

每个路口都有开关决定轨道方向,开关一开始通向第s[i,1]个路口,想走另一个轨道,他就必须下车切换开关的状态,计算一辆从路口A到路口B最少需要下车切换几次开关。

题解:

spfa:

就是一个有向图中找i到j的最短路。

最多100个路口,其实用floyd,dijkstra都可以。

1.把每个路口能通往的其他路口记录下来,并且将数组初始化。

2.i到s[i,1]的权值是0,其他情况都是1,因为一开始开关指向s[i,1]。

3.做spfa。

var
s:array [0..101,0..101] of longint;
x,dis:array [0..101] of longint;
d:array [0..1001] of longint;
v:array [0..101] of boolean;
o,i,j,n,m,p,q:longint;

procedure spfa;
var
head,tail,i,j:longint;
begin
head:=0;
tail:=1;
dis[p]:=0;
v[p]:=true;
d[1]:=p;
while head<tail do
begin
inc(head);
i:=d[head];
for j:=1 to x[i] do
if (dis[i]+1<dis[s[i,j]]) or ((j=1) and (dis[i]<dis[s[i,j]]))
then begin
dis[s[i,j]]:=dis[i];
if j<>1 then inc(dis[s[i,j]]);
if v[s[i,j]]=false
then begin
v[s[i,j]]:=true;
inc(tail);
d[tail]:=s[i,j];
end;
end;
v[d[head]]:=false;
end;
end;

begin
readln(n,p,q);
for i:=1 to n do
begin
read(x[i]);
for j:=1 to x[i] do read(s[i,j]);
readln;
dis[i]:=maxlongint;
v[i]:=false;
end;
spfa;
if dis[q]<>maxlongint then writeln(dis[q])
else writeln('-1');
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: