Dijkstra算法
program dijkstra;
const maxvex=40; { 图的最大顶点数 }
maxval=999; { 表示无穷大的数 }
type
costtype=word; { 权值类型为无符号整型 }
graphp=^graph;
graph=record
cost:array[0..maxvex,0..maxvex]of costtype; { 代价矩阵 }
vexnum:word; { 图的顶点数 }
end;
var
dist:array[1..maxvex]of costtype; { 到各顶点的最短路径数值 }
path:array[0..maxvex,0..maxvex]of word; { 每行记录最短路径,其中path[i][0]为到顶点i的路径长度}
i,j,v1:word;
g:graphp;
fin:text;
procedure creat_graph(g:graphp); { 建立图的存储结构 }
var i,j,k,w,edge:word;
begin
{ write('Input the number of vertexs and edges:'); }
read(fin,g^.vexnum,edge); { 输入图的顶点数和边数 }
{ 初始化邻接矩阵 }
for i:=1 to g^.vexnum do
for j:=1 to g^.vexnum do
begin
g^.cost[i,j]:=maxval;
g^.cost[i,i]:=0; { 主对角线为0 }
end;
{write('Input edges(begin to weight):'); }
for k:=1 to edge do
begin
begin
read(fin,i,j,w); { 输入起点号 边号 权值 }
g^.cost[i,j]:=w;
end;
end;
end;
procedure shortpath(g:graph; v:word); { 顶点V到其他顶点最短路径的算法,V为顶点序号 }
var i,j,k,k2:word;
minqz:costtype;
s:array[1..maxvex]of boolean;
begin
for i:=1 to maxvex do s[i]:=false; { 初始化,表示到顶点i的最短路径是否已经求得 }
s[v]:=true;
for i:=1 to g.vexnum do { 初始化dist数组和path数组 }
begin
dist[i]:=g.cost[v,i];
if (dist[i]<maxval) then begin path[i,v]:=i; path[i,0]:=1; end
else path[i,0]:=0;
end;
{ 输出dist分量值,以显示求解过程 }
for i:=1 to g.vexnum do write(dist[i]:5); writeln;
for i:=1 to g.vexnum-1 do
begin { 求顶点v的一条最短路径 }
minqz:=maxval; j:=v;
for k:=1 to g.vexnum do
if (not s[k]) and ( dist[k]<minqz) then
begin j:=k; minqz:=dist[k]; end;
s[j]:=true; { 顶点j加入s }
{ 由新求得的路径修改dist数组各分量 }
for k:=1 to g.vexnum do
if ((not s[k]) and ((dist[j]+g.cost[j][k])<dist[k])) then
begin
dist[k]:=dist[j]+g.cost[j,k];
write(dist[k]:5);
for k2:=1 to path[j,0] do
path[k,k2]:=path[j,k2];
k2:=path[j,0]+1;
path[k,k2]:=k;
path[k,0]:=path[j][0]+1;
end;
end;
end;
begin
assign(fin,'input.txt');
reset(fin);
new(g);
creat_graph(g);
{write('Input the number of beginning vertex:');}
read(fin,v1); { 输入开始顶点号 }
close(fin);
shortpath(g^,v1);
writeln;
{ 输出顶点V1到其他顶点的最短路径 }
writeln('v1 to else');
writeln;
for i:=1 to g^.vexnum do write(dist[i]:5);
writeln;
for i:=1 to g^.vexnum do
begin
writeln;
write(v1:5);
for j:=1 to path[i,0] do write(path[i,j]:5);
end;
readln;
end.
program dijkstra;
const maxvex=40; { 图的最大顶点数 }
maxval=999; { 表示无穷大的数 }
type
costtype=word; { 权值类型为无符号整型 }
graphp=^graph;
graph=record
cost:array[0..maxvex,0..maxvex]of costtype; { 代价矩阵 }
vexnum:word; { 图的顶点数 }
end;
var
dist:array[1..maxvex]of costtype; { 到各顶点的最短路径数值 }
path:array[0..maxvex,0..maxvex]of word; { 每行记录最短路径,其中path[i][0]为到顶点i的路径长度}
i,j,v1:word;
g:graphp;
fin:text;
procedure creat_graph(g:graphp); { 建立图的存储结构 }
var i,j,k,w,edge:word;
begin
{ write('Input the number of vertexs and edges:'); }
read(fin,g^.vexnum,edge); { 输入图的顶点数和边数 }
{ 初始化邻接矩阵 }
for i:=1 to g^.vexnum do
for j:=1 to g^.vexnum do
begin
g^.cost[i,j]:=maxval;
g^.cost[i,i]:=0; { 主对角线为0 }
end;
{write('Input edges(begin to weight):'); }
for k:=1 to edge do
begin
begin
read(fin,i,j,w); { 输入起点号 边号 权值 }
g^.cost[i,j]:=w;
end;
end;
end;
procedure shortpath(g:graph; v:word); { 顶点V到其他顶点最短路径的算法,V为顶点序号 }
var i,j,k,k2:word;
minqz:costtype;
s:array[1..maxvex]of boolean;
begin
for i:=1 to maxvex do s[i]:=false; { 初始化,表示到顶点i的最短路径是否已经求得 }
s[v]:=true;
for i:=1 to g.vexnum do { 初始化dist数组和path数组 }
begin
dist[i]:=g.cost[v,i];
if (dist[i]<maxval) then begin path[i,v]:=i; path[i,0]:=1; end
else path[i,0]:=0;
end;
{ 输出dist分量值,以显示求解过程 }
for i:=1 to g.vexnum do write(dist[i]:5); writeln;
for i:=1 to g.vexnum-1 do
begin { 求顶点v的一条最短路径 }
minqz:=maxval; j:=v;
for k:=1 to g.vexnum do
if (not s[k]) and ( dist[k]<minqz) then
begin j:=k; minqz:=dist[k]; end;
s[j]:=true; { 顶点j加入s }
{ 由新求得的路径修改dist数组各分量 }
for k:=1 to g.vexnum do
if ((not s[k]) and ((dist[j]+g.cost[j][k])<dist[k])) then
begin
dist[k]:=dist[j]+g.cost[j,k];
write(dist[k]:5);
for k2:=1 to path[j,0] do
path[k,k2]:=path[j,k2];
k2:=path[j,0]+1;
path[k,k2]:=k;
path[k,0]:=path[j][0]+1;
end;
end;
end;
begin
assign(fin,'input.txt');
reset(fin);
new(g);
creat_graph(g);
{write('Input the number of beginning vertex:');}
read(fin,v1); { 输入开始顶点号 }
close(fin);
shortpath(g^,v1);
writeln;
{ 输出顶点V1到其他顶点的最短路径 }
writeln('v1 to else');
writeln;
for i:=1 to g^.vexnum do write(dist[i]:5);
writeln;
for i:=1 to g^.vexnum do
begin
writeln;
write(v1:5);
for j:=1 to path[i,0] do write(path[i,j]:5);
end;
readln;
end.