Floyd算法

全文转自:http://blog.csdn.net/perfect2011/article/details/7568375

Floyd算法

作者:silence、2012年5月15日

本文参考:Google,数据结构(C语言)
本人声明:个人原创,转载请注明出处。

本文链接:http://blog.csdn.net/perfect2011/article/details/7568375

一 简介

Floyd算法是一种用于寻找图中每一对定点之间最短路径的算法。

二 重点

1,从任意一条单边路径开始。所有两点之间的距离是边的权,或者无穷大,如果两点之间没有边相连。 
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它

三 代码实现

[java] view plaincopy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. /* 
  4. Author : silence 
  5. Time : 2012/5/15 
  6. description : 每一对顶点的最短距离   
  7. */   
  8. using namespace std;  
  9. struct Graph  
  10. {  
  11.        int arrArc[20][20];  
  12.        int verCount;  
  13.        int arcCount;  
  14.        };  
  15. void floyd(Graph *p,int dis[20][20]){  
  16.        
  17.      for(int k = 0;k<p->verCount;k++)  
  18.         for(int i = 0;i<p->verCount;i++)  
  19.            for(int j = 0;j<p->verCount;j++)  
  20.            {  
  21.                    //存在更近的路径,则更新   
  22.                    if(dis[i][j]>dis[i][k]+dis[k][j])  
  23.                    dis[i][j]=dis[i][k]+dis[k][j];  
  24.            }  
  25.        
  26.      }  
  27.   
  28. int main(int argc, char *argv[])  
  29. {  
  30.     Graph g;  
  31.     cout<<"input the number of ver and arc"<<endl;  
  32.     cin>>g.verCount>>g.arcCount;  
  33.     cout<<"input the arc"<<endl;  
  34.     //初始化邻接矩阵   
  35.     for(int i = 0;i<g.verCount;i++)  
  36.     { for(int j = 0;j<g.verCount;j++)  
  37.        {  
  38.               //i到本身的距离为0  
  39.               //不同节点值为不可达   
  40.               if(i==j) g.arrArc[i][i]= 0;  
  41.               else  
  42.               g.arrArc[i][j] = 65535;  
  43.               }  
  44.             }   
  45.       
  46.     int  a,b,distance;  
  47.     //无向图 输入各边的权值   
  48.     for(int i=0;i<g.arcCount;i++)  
  49.     {  
  50.         cin>>a>>b>>distance;  
  51.         g.arrArc[a][b]=g.arrArc[b][a]=distance;      
  52.     }  
  53.     floyd(&g,g.arrArc);  
  54.     cout<<g.arrArc[0][1]<<endl;  
  55.       
  56.     system("PAUSE");  
  57.     return EXIT_SUCCESS;  
  58. }  



四 算法剖析

 

Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能:

1是直接从A到B,

2是从A经过若干个节点X到B。

所以,我们假设dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查dis(AX) + dis(XB) < dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置dis(AB)= dis(AX) +dis(XB),这样一来,当我们遍历完所有节点X,dis(AB)中记录的便是A到B的最短路径的距离。

 

五注意点

三个循环的求中间点的K的循环必须放在外面。

因为如果放在内层,对于A—B之间的经过AX和BX的还没有求到最小值,所以A—B最后不是最小值

六测试数据

Input:

4 4

0 1 11

1 2 2

2 3 3

3 0 4

Output :

 9


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章