Код: Выделить всё
procedure Dijkstra(var M:TMapOfLong; v,x,y:longint; var work:TMasOfBool; var way:TMasWay);
var
i,j,minv,u:longint;
t:array[1..maxV] of boolean;
b:array[1..maxV,1..2] of longint;
d:array[1..maxV] of longint;
begin
fillchar(t,sizeof(t),true);
fillchar(way,sizeof(way),0);
fillchar(w,sizeof(w),0);
for i:=1 to V do d[i]:=maxlongint;
d[x]:=0;
minv:=x;
for i:=1 to V-1 do
begin
u:=minv;
t[u]:=false;
min:=maxlongint;
for j:=1 to V do if t[j] then
begin
if (M[u,j]>0) and (work[M[u,j]]) and (d[j]>d[u]+1) then
begin
d[j]:=d[u]+1;
b[j,1]:=u;
b[j,2]:=M[u,j];
end;
if d[j]<min then
begin
min:=d[j];
minv:=j;
end;
end;
if (min=maxlongint) then break;
end;
if t[y] then exit;
i:=y;
while (i<>x) do
begin
inc(way[0]);
way[way[0]]:=b[i,2];
i:=b[i,1];
end;
for i:=1 to way[0] div 2 do
begin
j:=way[i];
way[i]:=way[way[0]-i+1];
way[way[0]-i+1]:=j;
end;
end.