洛谷 P1346 电车

    xiaoxiao2021-03-25  95

    题目大意: 每个路口都有开关决定轨道方向,开关一开始通向第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.
    转载请注明原文地址: https://ju.6miu.com/read-13371.html

    最新回复(0)