D : array[1..MaxN] of integer; //масив найкоротших відстаней
procedure Deisktr(A : Matrix; N, s : integer); //s -шукана вершина
var i, j, v, min : longint;
begin
visited[s] := TRUE; //вершина S переглянута
for i := 1 to N do D[i] := A[s, i]; //початковий масив відстаней
for i := 1 to n-1 do //на кожному кроці знаходимо мінімальне рішення і намагаємося його поліпшити
begin
min := inf;
for j := 1 to N do if (not visited[j]) and (D[j] < min) then
begin
min := D[j]; //мінімальна відстань
v := j; //знайдена вершина
end;
for j := 1 to N do if (D[j] > D[v] + A[v, j]) and (D[v] < inf) and (A[v, j] < inf) then D[j] := D[v] + A[v, j]; //намагаємося поліпшити рішення. Якщо в ній відстань більше, ніж сума відстані до поточної вершини і довжини ребра, то зменшуємо його.
s := v; //нова поточна вершина
visited[v] := TRUE; //і вона відзначається як переглянута
end;
end;