best:=0;
for i:=1 to n do
If mark[i] then { 对每一个已计算出最短路径的点 }
for j:=1 to n do
if (not mark[j]) and (a[i,j]>0) then
if (best=0) or (b[i]+a[i,j]<best) then begin
best:=b[i]+a[i,j]; best_j:=j;
end;
if best>0 then begin
b[best_j]:=best ; mark[best_j]:=true;
end;
until best=0;
end;{bhf}
B.Floyed 算法求解所有顶点对之间的最短路径:
procedure floyed;
begin
for I:=1 to n do
for j:=1 to n do
if a[I,j]>0 then p[I,j]:=I else p[I,j]:=0; {p[I,j] 表示 I 到 j 的最短路径上 j 的前驱结点 }
for k:=1 to n do { 枚举中间结点 }
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[j,k]<a[i,j] then begin
a[i,j]:=a[i,k]+a[k,j];
p[I,j]:=p[k,j];
end;
end;
C. Dijkstra 算法:
var
a:array[1..maxn,1..maxn] of integer;
b,pre:array[1..maxn] of integer; {pre[i] 指最短路径上 I 的前驱结点 }
mark:array[1..maxn] of boolean;
procedure dijkstra(v0:integer);
begin
fillchar(mark,sizeof(mark),false);
for i:=1 to n do begin
d[i]:=a[v0,i];
if d[i]<>0 then pre[i]:=v0 else pre[i]:=0;
end;
mark[v0]:=true;
repeat { 每循环一次加入一个离 1 集合最近的结点并调整其他结点的参数 }
min:=maxint; u:=0; {u 记录离 1 集合最近的结点 }
for i:=1 to n do
if (not mark[i]) and (d[i]<min) then begin