最短路徑——floyd算法代碼(c語言)


最短路徑問題

  昨天自己試了試寫一下dijkstra的算法博客

  dijkstra鏈接在這←

  今天來更floyd算法,感覺非常簡單果然暴力才是解決一切的王道

 

一、總體思想

  floyd算法就是每一次從鄰接矩陣選取一個頂點k,然后再去矩陣中遍歷兩個頂點i,j,看看是i→j的路徑短,還是i→k→j的路徑短,就是完全的暴力,算法和代碼非常簡單

二、代碼實現

 1 void Floyd(Graph G)
 2 {
 3     int arr[G.vexnum][G.vexnum];
 4     for(int i = 0; i < G.vexnum; i++)
 5         for(int j = 0; j < G.vexnum; i++)
 6             arr[i][j] = G.edge[i][j];
 7     
 8     for(int k; k < G.vexnum; k++)
 9         for(int i = 0; i < G.vexnum; i++)
10             for(int j = 0; j < G.vexnum; j++)
11                 if(arr[i][j] > arr[i][k] + arr[k][j])
12                     arr[i][j] = arr[i][k] + arr[k][j];
13  } 

三、代碼解釋

  其實看上面的代碼量和代碼就知道這個算法很簡單  =_=

  傳入Floyd算法的參數是Graph G

  首先開辟一個二維數組arr[][],並且把圖的鄰接矩陣G.edge[][]賦值給arr[][],算法的主要思想就是來修改arr[][]值暴力出最短路徑

1 int arr[G.vexnum][G.vexnum];//開辟數組arr[][]接收圖G.edge[][]的值 
2     for(int i = 0; i < G.vexnum; i++)
3         for(int j = 0; j < G.vexnum; i++)
4             arr[i][j] = G.edge[i][j];//遍歷賦值 

  然后就是每次選擇一個頂點k,再去找兩個頂點i,j,對比看看是i→j的路徑短,還是i→k→j的路徑短

  也就是arr[i][j] 和 arr[i][k] + arr[k][j]兩個的值誰的比較小,然后修改arr[][]一直到遍歷完畢

1 for(int k; k < G.vexnum; k++)//選取k頂點 
2         for(int i = 0; i < G.vexnum; i++)
3             for(int j = 0; j < G.vexnum; j++)//再選取i,j兩個頂點 
4                 if(arr[i][j] > arr[i][k] + arr[k][j])//判斷i→j的路徑和i→k→j的路徑誰比較短 
5                     arr[i][j] = arr[i][k] + arr[k][j];//如果i→k→j的路徑更短,則修改數組arr[][] 

  寫完感覺好短。。不過確實沒啥寫的,就是O(n3)的暴力,而且這個算法能計算含有負權值的圖,dijkstra就不行

  雖然dijkstra的算法只有O(n2),但是它只有一個頂點到剩下頂點的最短路徑,如果還是要計算每個點到每個點的最短路徑,其實和Floyd一樣,也是O(n3

  最重要的是 ——Floyd算法他好記啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM