代码和函数定义如下,运行后会产生如题的错误,不知怎么解决,请高手指教!运行:
procedure TForm2.Button1Click(Sender: TObject);
var
G1:Tgraph;
v,t:integer;begin
v:= StrToInt(Edit2.Text);//数字
t:= StrToInt(Edit3.Text);//数字
CreateGraphic(G1);
ShortestPath(G1, v, t);
Post(R,G1);
end;
函数定义:
procedure CreateGraphic(G:TGraph);
var
i,j:integer;
begin
Form2.ADOQuery2.Active:= True;
Form2.ADOQuery2.First;
G.n:= Form2.ADOQuery2.RecordCount;
for i:= 0 to (G.n - 1) do
begin
G.Vexs[i]:= i;
for j:= 0 to (G.n - 1) do
begin
if IntToStr(Form2.ADOQuery2.Fields[j].AsInteger) = #0 THEN
G.Edges[i,j]:=1000
else
G.Edges[i,j]:= Form2.ADOQuery2.Fields[j].AsInteger; end;
Form2.ADOQuery2.Next;
end; for i:= 0 to (G.n - 1) do
begin
for j:= 0 to (G.n - 1) do
begin
if G.Edges[i,j] = 0 then G.Edges[i,j]:= 1000; end;
end;
end;
procedure ShortestPath(G:TGraph; v0,v1:integer);
var
i,j,v,k,min,Max: integer;
P: Array[0..39,0..39] of integer;
Final: Array[0..39] of boolean;
D: Tarr1;
begin
Max:=0;
for i:=0 to (G.n - 1) do
begin
D[i]:= G.Edges[v0,i];
Final[i]:= False;
for k:= 0 to (G.n - 1) do
begin
p[i,k]:= 0;
if (D[i] < 1000) then
begin
P[i,v0]:= 1;
P[i,i]:= 2;
end;
end;
end; D[v0]:= 0;
final[v0]:= True; for i:=0 to (G.n - 1) do
begin
min:=1000;
for j:=0 to (G.n - 1) do
begin
if not final[j] then
begin
if D[j] < min then
begin
v:= j;
min:= D[j];
end
else
ShowMessage('路径信息可能有错误,请检查!');
end;
end; final[v]:= True; for j:=0 to (G.n - 1) do
begin
if (not final[j]) and ((min + G.Edges[v, j]) < (D[j])) then
begin
D[j]:= min + G.Edges[v, j];
for k:= 0 to (G.n - 1) do
begin
P[j,k]:=P[v,k];
end;
for k:= 0 to (G.n - 1) do //取得最大的序号,
begin
if P[j, k] > Max then Max:= P[j, k];
end;
p[j, j]:= Max +1;
end; end;
end; for k:= 0 to (G.n - 1) do
begin
R[k]:= P[v1,k];
end;end;procedure Post(arr1:Tarr1;g1:Tgraph);
var
i,j,k:integer;
begin for i:=0 to (g1.n - 1) do
begin
for j:= 0 to (g1.n - 1) do
begin
if arr1[j] = (i + 1) then
begin
k:= i + 1;
Form2.ADOQuery1.AppendRecord([MyStr,k,0,1,0,j,1,1]);
end;
end; end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
G1:Tgraph;
v,t:integer;begin
v:= StrToInt(Edit2.Text);//数字
t:= StrToInt(Edit3.Text);//数字
CreateGraphic(G1);
ShortestPath(G1, v, t);
Post(R,G1);
end;
函数定义:
procedure CreateGraphic(G:TGraph);
var
i,j:integer;
begin
Form2.ADOQuery2.Active:= True;
Form2.ADOQuery2.First;
G.n:= Form2.ADOQuery2.RecordCount;
for i:= 0 to (G.n - 1) do
begin
G.Vexs[i]:= i;
for j:= 0 to (G.n - 1) do
begin
if IntToStr(Form2.ADOQuery2.Fields[j].AsInteger) = #0 THEN
G.Edges[i,j]:=1000
else
G.Edges[i,j]:= Form2.ADOQuery2.Fields[j].AsInteger; end;
Form2.ADOQuery2.Next;
end; for i:= 0 to (G.n - 1) do
begin
for j:= 0 to (G.n - 1) do
begin
if G.Edges[i,j] = 0 then G.Edges[i,j]:= 1000; end;
end;
end;
procedure ShortestPath(G:TGraph; v0,v1:integer);
var
i,j,v,k,min,Max: integer;
P: Array[0..39,0..39] of integer;
Final: Array[0..39] of boolean;
D: Tarr1;
begin
Max:=0;
for i:=0 to (G.n - 1) do
begin
D[i]:= G.Edges[v0,i];
Final[i]:= False;
for k:= 0 to (G.n - 1) do
begin
p[i,k]:= 0;
if (D[i] < 1000) then
begin
P[i,v0]:= 1;
P[i,i]:= 2;
end;
end;
end; D[v0]:= 0;
final[v0]:= True; for i:=0 to (G.n - 1) do
begin
min:=1000;
for j:=0 to (G.n - 1) do
begin
if not final[j] then
begin
if D[j] < min then
begin
v:= j;
min:= D[j];
end
else
ShowMessage('路径信息可能有错误,请检查!');
end;
end; final[v]:= True; for j:=0 to (G.n - 1) do
begin
if (not final[j]) and ((min + G.Edges[v, j]) < (D[j])) then
begin
D[j]:= min + G.Edges[v, j];
for k:= 0 to (G.n - 1) do
begin
P[j,k]:=P[v,k];
end;
for k:= 0 to (G.n - 1) do //取得最大的序号,
begin
if P[j, k] > Max then Max:= P[j, k];
end;
p[j, j]:= Max +1;
end; end;
end; for k:= 0 to (G.n - 1) do
begin
R[k]:= P[v1,k];
end;end;procedure Post(arr1:Tarr1;g1:Tgraph);
var
i,j,k:integer;
begin for i:=0 to (g1.n - 1) do
begin
for j:= 0 to (g1.n - 1) do
begin
if arr1[j] = (i + 1) then
begin
k:= i + 1;
Form2.ADOQuery1.AppendRecord([MyStr,k,0,1,0,j,1,1]);
end;
end; end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货