博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

任意结点最短路径算法(Floyd算法)

Posted on 2010-10-20 10:57  桃子在路上  阅读(594)  评论(0)    收藏  举报

设图G=(V,E)是一个有向图,对于每对结点(U,V),找出从U到V的最短路径。
【Floyd算法思想】
    利用一个三重循环产生一个存储每个结点最短距离的矩阵.
【Floyd算法实例】
    现有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表城市之间的距离。求每个城市的最短距离
【输入】 第一行两个数v,e,分别代表城市数和边数 以下e行,每行为两个顶点和它们之间的边权。
【输出】 所有可能连接的城市的最短距离。
 

【输入样例】
6 10
1 2 10
1 5 19
1 6 21
2 3 5
2 4 6
2 6 11
3 4 6
4 5 18
4 6 14
5 6 33                                                                                   
 
【输出样例】
1 2 10
1 3 15
1 4 16                                                
1 5 19
1 6 21
2 3 5
2 4 6
2 5 24
2 6 11
3 4 6
3 5 24
3 6 16
4 5 18
4 6 14
5 6 32
 

program floyd_example;
const
  maxn=10;
var
  n,s,t,i,j:integer;
  dist:array[1..maxn,1..maxn] of real;
  prev:array[1..maxn,1..maxn] of 0..maxn;
procedure init;
  var
    m,i,u,v:integer;
  begin
    assign(input,'floyd.in');
    reset(input);
    assign(output,'floyd.out');
    rewrite(output);
    readln(n,m);
    fillchar(prev,sizeof(prev),0);
    for u:=1 to n do
     for v:=1 to n do
       dist[u,v]:=1e10;
    for i:=1 to m do
      begin
        readln(u,v,dist[u,v]);
        dist[v,u]:=dist[u,v];
        prev[u,v]:=u;
        prev[v,u]:=v;
     end;
  end;{init}
procedure floyd;
  var
    i,j,k:integer;
  begin
    for k:=1 to n do
      for i:=1 to n do
         for j:=1 to n do
           if (dist[i,k]+dist[k,j]<dist[i,j])
              then  begin
                 dist[i,j]:=dist[i,k]+dist[k,j];
                 prev[i,j]:=prev[k,j];
                end;
  end;{floyd}
procedure print(i,j:integer);
  begin
    if i=j
      then write(i)
      else if prev[i,j]=0
             then write('No Solution!')
             else begin
                  print(i,prev[i,j]);
                  write('->',j);
                  end;
  end;{print}
begin
  init;
  floyd;
  for i:=1 to n do
    for j:=i+1 to n do
      begin
        write(i,' ',j,' ');
        write(dist[i,j]:0:0,' ');
        print(i,j);
        writeln;
      end;
  close(input);
  close(output);
end.