WarShall算法


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


參考資料:
離散數學(第三版),清華大學出版社



免責聲明!

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



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