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


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