1.引言
圖的連通性問題是圖論研究的重要問題之一,在實際中有着廣泛的應用。例如在通信網絡的聯通問題中,運輸路線的規划問題等等都涉及圖的連通性。因此傳遞閉包的計算需要一個高效率的算法,一個著名的算法就是warshall在1962年提出的WarShall算法。
2.算法描述
使用n階布爾矩陣\(R^{(k)}(0\leq k\leq n)\)來表示有向圖中任意一對節點 是否含有路徑的信息。因此,可將原問題划分為如下決策階段:
\[R^{(0)},R^{(1)},\cdots,R^{(k)},\cdots ,R^{(n)} \]
具體來說,當且僅當從節點i到節點j存在一條有向路徑,且該路徑上的每一個中間節點的編號都不大於k時,矩陣\(R^{(k)}\)的第i行,第j列的元素\(r_{ij}^{(k)}=1\)。
對於\(R^{(k)}\)的計算我們可以由它的前趨\(R^{(k-1)}\) 計算得到(分級推進計算)。
- \(R^{(0)}\) ——該矩陣不允許它的路徑中包含任何中間頂點,即從該矩陣的任意頂點出發的路徑不含有中間頂點,此即鄰接矩陣。
- \(R^{(1)}\) ——允許路徑中包含第1個頂點(本例編號1)作為中間頂點。
- \(R^{(2)}\) ——允許路徑中包含前2個頂點(本例編號1、2)作為中間頂點。
- \(R^{(k)}\) ——允許路徑中包含前k個頂點作為中間頂點。
- \(R^{(n)}\) ——允許路徑中包含全部 n 個頂點作為中間頂點。
所以綜上所述我們得到\(R^{(k)}\)的計算方式如下:
\[R^{k}[i,j]\leftarrow R^{k-1}[i,j]+R^{k-1}[i,k]\cdot R^{k-1}[k,j] \]
3.算法實現
for(int k=0;k<N;k++){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
t[i][j]=t[i][j]||(t[i][k]&&t[k][j]);//由文中公式可得
}
}
}
算法優化
``` for(int k=0;k
參考資料:
離散數學(第三版),清華大學出版社