洛谷 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。
每个路口都有开关决定轨道方向,开关一开始通向第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.