王心远吧 关注:18贴子:329
  • 1回复贴,共1

Dijkstra算法

只看楼主收藏回复

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. 
 
 



1楼2007-05-22 22:06回复