数据结构最短路径,看的头都晕了,谁帮我注释下(50分)

  • 主题发起人 xiaoshun
  • 开始时间
X

xiaoshun

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.GetPClick(Sender: TObject);
var
i,j,k: integer;
X: real;
begin
for i:=1 to N1do
for j:=1 to N1do
if V1.Cells[i,j]='' then
d1[i,j]:=0
else
begin
if uppercase(V1.Cells[i,j])='M' then
d1[i,j]:=1000000
else
d1[i,j]:=strtofloat(V1.Cells[i,j]);
end;

for i:=1 to N1do
begin
for j:=1 to N1do
begin
for k:=1 to N1do
begin
X:=D1[j,i]+D1[i,k];
if D1[j,k]<X then
temp1[j,k]:=D1[j,k]
else
temp1[j,k]:=X;
end;
end;
for j:=1 to n1do
for k:=1 to n1do
D1[j,k]:=temp1[j,k];
end;
if assigned(W1) then
W1.Free;
W1:=TStringGrid.Create(self);
W1.Parent:=GroupBox2;
W1.Top:=50;
W1.Left:=50;
W1.Height:=26*(N1+1);
W1.Width:=66*(N1+1);
W1.RowCount:=N1+1;
W1.ColCount:=N1+1;
W1.Align:=alClient;
W1.Options:=[goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,GoRangeSelect,goEditing];
for i:=1 to N1do
begin
W1.Cells[i,0]:=inttostr(i);
W1.cells[0,i]:=inttostr(i);
end;

for i:=1 to n1do
for j:=1 to n1do
begin
W1.Cells[i,j]:=Floattostr(D1[i,j]);
if temp1[i,j]<>1000000 then
W1.Cells[i,j]:=Floattostr(temp1[i,j])
else
W1.Cells[i,j]:='断路';
end;
end;
 
这是什么算法, 太难读了吧, 我这有a*算法的delphi版. 自己写的要是想要, 给你找找.
 
怎么有点像走迷宫的那种回溯算法啊
 
for i:=1 to N1do
begin
for j:=1 to N1do
begin
for k:=1 to N1do
begin
X:=D1[j,i]+D1[i,k];
if D1[j,k]<X then
temp1[j,k]:=D1[j,k]
else
temp1[j,k]:=X;
end;
end;
for j:=1 to n1do
for k:=1 to n1do
D1[j,k]:=temp1[j,k];
end;
只有这一段体现算法,其他的可以不看.
大致思路是计算通过i中转的j到k的最短路径,如果通过i中转比已计算出的j到k的路径还短,那么更新d1[j, k].全部试过以后得到最短路径长度.
 
计算从当前节点出发可能的最短距离(包括通过中间结点)如果通过中间节点的值比前一次的值小,就把该节点存入最短距离上的路径。以此类推。
 
用迪杰斯特拉算法就可以了
 
看算法,这个好像可以运用到负数吧?迪杰斯特拉不能有负数。
 
顶部