切换到宽版
  • 8960阅读
  • 5回复

[测试题]Floyd算法 [复制链接]

上一主题 下一主题
离线stevenjl
 

只看楼主 倒序阅读 0 发表于: 2006-08-21
Floyd算法
给出一个图,求最短路径问题的一个O(n^3)算法

优点:容易理解,可以算出任意两个节点之间最短距离的算法,程序容易写

缺点:复杂度达到三次方,不适合计算大量数据

Floyd算法的功能是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵.

它的功能看上去挺强大的,但它的实现却很简单,和Washall算法很相似,也是一个三层循环,思路也是相似是,就是利用前面计算的结果:

核心思想:设立[i,j]为权值
for(k=0;k<len;k++)
for(i=0;i<len;i++)
for(j=0;j<len;j++)
if(a[k,j]+a[j,i]<a[k][i])a[k][i]=a[k,j]+a[j,i];

【用PASCAL描述】
设数组A是保存图结构的邻接矩阵,数组P是与数组A结构相同的一个数组,用于保存路径.  
 
Floyd算法非常简单,主体就是一个三重循环,时间复杂度为O(n^3)   :  
For   k:=1   To   n   Do  
    For   i:=1   To   n   Do  
      For   j:=1   To   n   Do  
        If   A[i,k]   +   A[k,j]   <   A[i,j]   Then  
        Begin  
            A[i,j]:=A[i,k]+A[k,j];  
            P[i,j]:=k;  
        End;  
 
Floyd算法执行完后,数组A中保存的就是各点之间的最短路径长度.  
如A[1,3],就是从1到3的最短路径的长度.  
 
如果要求具体的路径,则要用递归和数组P:  
Procedure   path   (i,j   :   Integer);  
Var  
    k   :   Integer;  
 
Begin  
    k   :=   P[i,j];  
    If   k<>0   Then  
    Begin  
      path(i,k);  
      Writeln(K);  
      path(k,j)  
    End;  
End;
Dream Walker...
离线r134a
只看该作者 1 发表于: 2006-08-21
为何要先for k?
.


祝大家明年NOIP大获全盛!


.
离线jysc
只看该作者 2 发表于: 2006-08-22
枚举中间点
离线amyhab
只看该作者 3 发表于: 2007-11-11
不懂
To Be,Or not to be.That's a Question!!!!!!!
离线clwxzh57
只看该作者 4 发表于: 2007-11-11
floyed算法好写,就是复杂度高
离线181818181818
只看该作者 5 发表于: 2007-11-12
看不东!
快速回复
限100 字节
 
上一个 下一个