演算法思路:
通過floyd計算圖g=(v,e)中各個頂點的最短路徑時,需要引入兩個矩陣,矩陣s中的元素a[i][j]表示頂點i(第i個頂點)到頂點j(第j個頂點)的距離。矩陣p中的元素b[i][j],表示頂點i到頂點j經過了b[i][j]記錄的值所表示的頂點。
假設圖g中頂點個數為n,則需要對矩陣d和矩陣p進行n次更新。初始時,矩陣d中頂點a[i][j]的距離為頂點i到頂點j的權值;如果i和j不相鄰,則a[i][j]=∞,矩陣p的值為頂點b[i][j]的j的值。 接下來開始,對矩陣d進行n次更新。第1次更新時,如果」a[i][j]的距離」 > 「a[i][0]+a[0][j]」(a[i][0]+a[0][j]表示」i與j之間經過第1個頂點的距離」),則更新a[i][j]為」a[i][0]+a[0][j]」,更新b[i][j]=b[i][0]。 同理,第k次更新時,如果」a[i][j]的距離」 > 「a[i][k-1]+a[k-1][j]」,則更新a[i][j]為」a[i][k-1]+a[k-1][j]」,b[i][j]=b[i][k-1]。更新n次之後,操作完成!
public class floyd演算法 ,,,
,,};floyd(weight);
}private static void floyd(int weight)
}//計算最短路徑,弗洛伊德的核心是三重迴圈,k作為中間點
for(int k = 0; k < n; k++)}}
}for(int j = 0; j < n; j++)
system.out.print(weight[0][j] + " ");
}system.out.println();
for(int i = 0; i < n; i++)
system.out.print("(" + i + "," + j + ")" + weight[i][j] + ": ");
system.out.print(i);
while(k != j)
system.out.println("->" + j);
}system.out.println();}}
}
弗洛伊德演算法
弗洛伊德演算法 floyd 又稱為是插點法。目的是求加權圖中頂點中最短路徑的方法。本文通過舉例子的方法想你具體解釋何為弗洛伊德演算法。有乙個送禮物的問題,是csdn上的乙個題目,題目的詳情是這樣的。hehe和xixi在乙個地方玩遊戲,xixi把n 1件禮物 hehe以前送給xixi的 分別藏在了另外...
弗洛伊德演算法
floyd演算法詳解 求解任意兩點間的最短距離 floyd warshall演算法,簡稱floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為o n 3 我們平時所見的floyd演算法的一般形式如下 1void floyd 注意下第6行這個地方,如果dist i k 或者dist k j 不存...
弗洛伊德演算法
弗洛伊德演算法 求任意一點i到任意一點j的最短路。分析 求i到j的最短路,大可以使用群舉法,因為點都是離散的,i到j的路徑是有限的,所以一定可以通過群舉法得到最短路,但群舉法卻沒太大意義,他的意義在於 把群舉法 通過修改 進行分類,得到好的演算法。flod演算法的分類標準是 通過i到j過點的情況進行...