我下载了一段关于过河问题的pascal源代码,怎么调试也不成功,那位高人为我调试一下?高分相赠Unit Dijkstra;
{$X+,S-}
{$M 16384,16384,655360}
interface
const
MaxVectexNum = 150;
MaxDistance = 10000;
type
TRange = 1..MaxVectexNum ;
TVectexName = Integer ;
TWeight = Integer ; TVectex = Array [TRange] of TVectexName ;
TEdge = Array [TRange,TRange] of TWeight;
TDistance = Array [TRange] of TWeight;
TSetOfVectex = Set of TRange;
var
vectex,preVectexPos : TVectex;
dist : TDistance;
edge : TEdge;
setOfVectex : TSetOfVectex;
beginVectexPos : Integer;
vectexNum : Integer;
minDist,distTemp: TWeight;
inFileName , outFileName : String ;
inFile , outFile : Text ;
procedure About;
procedure ReadData;
procedure PrintPath;
procedure Dijk;
implementationprocedure About;
begin
writeln;
writeln('{*****************************************}');
end;procedure ReadData;
var i , j :Integer ;
begin
write('Input the input data file name: ');
readln(inFileName);
assign(inFile,inFileName);
reset(inFile);
read(inFile,vectexNum);
if (vectexNum < 1) or (vectexNum > MaxVectexNum)
then
begin
writeln('The count of vectex is out of range!');
exit;
end
else
begin
for i := 1 to vectexNum do vectex[i] := i; { Init vectex[] }
for i := 1 to vectexNum do { Init edge[,] }
for j := 1 to vectexNum do
if i = j then edge[ vectex[i],vectex[j] ] := 0
else edge[ vectex[i],vectex[j] ] := MaxDistance;
repeat
read(inFile,i,j,edge[ vectex[i],vectex[j] ]);
edge[vectex[j],vectex[i]] :=
edge[ vectex[i],vectex[j]]; { No dection graph }
until ( eof(inFile));
close(inFile);
end ;
end ;procedure PrintPath;
var
i : Integer ;
procedure PrintSinglePath( beginVertexPos : Integer ; endVertexPos : Integer );
begin
if preVectexPos[ endVertexPos ] = beginVertexPos
then
begin
write(outFile,beginVertexPos);
end
else
begin
PrintSinglePath( beginVertexPos , preVectexPos[ endVertexPos ] );
end;
write(outFile,'-->');
write(outFile,endVertexPos);
end;
{PrintPath}
begin
write('Input the output data file name:');
readln(outFileName);
assign(outFile,outFileName);
rewrite(outFile);
writeln(outFile,'Shortest Path By DijkStra ');
for i:= 1 to vectexNum do
begin
write(outFile,'d(',vectex[beginVectexPos]:2,',',vectex[i]:2,')=');
if dist[vectex[i]] < MaxDistance
then
begin
write(outFile,dist[vectex[i]]:7);
write(outFile,'':2,' path: ');
PrintSinglePath(beginVectexPos , i);
writeln( outFile );
end
else
begin
write(outFile ,' +',Chr(236),'':3);
writeln(outFile,'':2,' No path ! ');
end ;
end;
close(outFile);
end;procedure Dijk;
var
i , j , nextI : Integer;
count : Integer ;
begin
{write('Input the begin vectex postion:');
readln(beginVectexPos);}
beginVectexPos := 1;
setOfVectex := []; for i:=1 to vectexNum do
begin
setOfVectex := setOfVectex+[ vectex[i] ];
dist[vectex[i]] := edge[ vectex[i],vectex[beginVectexPos] ];
preVectexPos[i] := beginVectexPos;
end; i := beginVectexPos;
count := 1;
setOfVectex:= setOfVectex-[ vectex[i] ]; repeat
minDist := MaxDistance;
for j := 1 to vectexNum do
begin
if vectex[j] in setOfVectex
then
begin
distTemp := dist[vectex[i]]+edge[vectex[i],vectex[j]];
if( (dist[vectex[j]] > distTemp ))
and ( edge[vectex[i],vectex[j]] < MaxDistance )
then
begin
dist[vectex[j]] := distTemp;
preVectexPos[j] := i;
end;
if (dist[vectex[j]]>0) and (dist[vectex[j]]<minDist) then
begin
minDist := dist[vectex[j]];
nextI := j;
end;
end;
end; if minDist<>MaxDistance then dist[vectex[nexti]] := minDist;
i := nextI;
inc( count );
setOfVectex := setOfVectex-[vectex[i]];
until ( count = vectexNum ) ;
end;end.
{$X+,S-}
{$M 16384,16384,655360}
interface
const
MaxVectexNum = 150;
MaxDistance = 10000;
type
TRange = 1..MaxVectexNum ;
TVectexName = Integer ;
TWeight = Integer ; TVectex = Array [TRange] of TVectexName ;
TEdge = Array [TRange,TRange] of TWeight;
TDistance = Array [TRange] of TWeight;
TSetOfVectex = Set of TRange;
var
vectex,preVectexPos : TVectex;
dist : TDistance;
edge : TEdge;
setOfVectex : TSetOfVectex;
beginVectexPos : Integer;
vectexNum : Integer;
minDist,distTemp: TWeight;
inFileName , outFileName : String ;
inFile , outFile : Text ;
procedure About;
procedure ReadData;
procedure PrintPath;
procedure Dijk;
implementationprocedure About;
begin
writeln;
writeln('{*****************************************}');
end;procedure ReadData;
var i , j :Integer ;
begin
write('Input the input data file name: ');
readln(inFileName);
assign(inFile,inFileName);
reset(inFile);
read(inFile,vectexNum);
if (vectexNum < 1) or (vectexNum > MaxVectexNum)
then
begin
writeln('The count of vectex is out of range!');
exit;
end
else
begin
for i := 1 to vectexNum do vectex[i] := i; { Init vectex[] }
for i := 1 to vectexNum do { Init edge[,] }
for j := 1 to vectexNum do
if i = j then edge[ vectex[i],vectex[j] ] := 0
else edge[ vectex[i],vectex[j] ] := MaxDistance;
repeat
read(inFile,i,j,edge[ vectex[i],vectex[j] ]);
edge[vectex[j],vectex[i]] :=
edge[ vectex[i],vectex[j]]; { No dection graph }
until ( eof(inFile));
close(inFile);
end ;
end ;procedure PrintPath;
var
i : Integer ;
procedure PrintSinglePath( beginVertexPos : Integer ; endVertexPos : Integer );
begin
if preVectexPos[ endVertexPos ] = beginVertexPos
then
begin
write(outFile,beginVertexPos);
end
else
begin
PrintSinglePath( beginVertexPos , preVectexPos[ endVertexPos ] );
end;
write(outFile,'-->');
write(outFile,endVertexPos);
end;
{PrintPath}
begin
write('Input the output data file name:');
readln(outFileName);
assign(outFile,outFileName);
rewrite(outFile);
writeln(outFile,'Shortest Path By DijkStra ');
for i:= 1 to vectexNum do
begin
write(outFile,'d(',vectex[beginVectexPos]:2,',',vectex[i]:2,')=');
if dist[vectex[i]] < MaxDistance
then
begin
write(outFile,dist[vectex[i]]:7);
write(outFile,'':2,' path: ');
PrintSinglePath(beginVectexPos , i);
writeln( outFile );
end
else
begin
write(outFile ,' +',Chr(236),'':3);
writeln(outFile,'':2,' No path ! ');
end ;
end;
close(outFile);
end;procedure Dijk;
var
i , j , nextI : Integer;
count : Integer ;
begin
{write('Input the begin vectex postion:');
readln(beginVectexPos);}
beginVectexPos := 1;
setOfVectex := []; for i:=1 to vectexNum do
begin
setOfVectex := setOfVectex+[ vectex[i] ];
dist[vectex[i]] := edge[ vectex[i],vectex[beginVectexPos] ];
preVectexPos[i] := beginVectexPos;
end; i := beginVectexPos;
count := 1;
setOfVectex:= setOfVectex-[ vectex[i] ]; repeat
minDist := MaxDistance;
for j := 1 to vectexNum do
begin
if vectex[j] in setOfVectex
then
begin
distTemp := dist[vectex[i]]+edge[vectex[i],vectex[j]];
if( (dist[vectex[j]] > distTemp ))
and ( edge[vectex[i],vectex[j]] < MaxDistance )
then
begin
dist[vectex[j]] := distTemp;
preVectexPos[j] := i;
end;
if (dist[vectex[j]]>0) and (dist[vectex[j]]<minDist) then
begin
minDist := dist[vectex[j]];
nextI := j;
end;
end;
end; if minDist<>MaxDistance then dist[vectex[nexti]] := minDist;
i := nextI;
inc( count );
setOfVectex := setOfVectex-[vectex[i]];
until ( count = vectexNum ) ;
end;end.
TVectexName = type Integer ;
TWeight = type Integer ;
试试吧
看下面!!
TRange : 1..MaxVectexNum ;
TVectexName : Integer ;
TWeight : Integer ;