You are on page 1of 2

program Shortest_Path_by_Dijkstra; const max = 100; maxC = 10000; var c: array[1..max, 1..max] of Integer; d: array[1..max] of Integer; Trace: array[1..

ray[1..max] of Integer; Free: array[1..max] of Boolean; n, S, F: Integer; procedure LoadGraph; var i, m: Integer; u, v: Integer; begin Readln(n, m, S, F); for u := 1 to n do for v := 1 to n do if u = v then c[u, v] := 0 else c[u, v] := maxC; for i := 1 to m do Readln(u, v, c[u, v]); end; procedure Init; var i: Integer; begin for i := 1 to n do begin d := c[S, i]; Trace := S; end; FillChar(Free, SizeOf(Free), True); end; procedure Dijkstra; var i, u, v: Integer; min: Integer; begin repeat u := 0; min := maxC; for i := 1 to n do if Free and (d < min) then begin min := d; u := i; end; if (u = 0) or (u = F) then Break; Free := False; for v := 1 to n do if Free[v] and (d[v] > d + c[u, v]) then

begin d[v] := d + c[u, v]; Trace[v] := u; end; until False; end; procedure PrintResult; begin if d[F] = maxC then Writeln('Not found any path from ', S, ' to ', F) else begin Writeln('Distance from ', S, ' to ', F, ': ', d[F]); while F <> S do begin Write(F, '<-'); F := Trace[F]; end; Writeln(S); end; end; begin Assign(Input, 'MINPATH.INP'); Reset(Input); Assign(Output, 'MINPATH.OUT'); Rewrite(Output); LoadGraph; Init; Dijkstra; PrintResult; Close(Input); Close(Output); end

You might also like