離散複習資料之一(Warshall演算法)

2021-08-02 06:48:59 字數 2291 閱讀 4754

我們先對r(n)進行解釋一下,不然你們看不太懂。

就是r(n)表示,通過從 1...n 個點繞到到達所求點,注意原來的位置的點,發生改變的就是剛才的含義去解釋。

給乙個例子解釋一下。

其中的r(i)...r(n);(0<=n<=4)

初始的r(0)就是可達矩陣。

r(1)表示在r(0)的基礎上面變化

r(1)表示在r(0)的基礎上面變化

r(2)表示在r(1)的基礎上面變化

r(3)表示在r(2)的基礎上面變化

r(4)表示在r(3)的基礎上面變化

關鍵:r(0)表示直接相連的關係,可以到達就記為1,否則就記為0.

r(1)表示從該點通過1可以到達目標點的記為1,否則就記為0.(多出來的點的關係)

r(2)表示從該點通過1,2可以到達目標點到達的記為1.否則就記為0.(與r(1)相比,多出來的點的關係。)

r(3)與r(4)表示的意思同上。

warshall演算法思想:

r(0)就只是有向圖的鄰接矩陣。

r(1)包含可以用第乙個頂點作為中間點的路徑資訊。

r(n)說明可以用所有的頂點作為中間點尋找有向路徑,所以r(n)就是我們要求的傳遞閉包,即可達矩陣。

這個演算法的中心是我們可以通過r(k-1)來計算r(k)的所有元素。

演算法的步驟如下:

r(k)

for(k

for(i

for(j

r(k)[i,j] = r(k-1)[i,j] or r(k-1)[i,k] and r(k-1)[k,j]

return  r(n)

通過上面的演算法步驟,我們也可以知道,推出r(n),只要知道r(n-1)的關係矩陣從而推出r(n)。

每一點的計算關係都會遵循乙個計算公式。

「r(k)[i,j] = r(k-1)[i,j] or r(k-1)[i,k] and r(k-1)[k,j]」

從而程式**也可以按照上面的計算關係進行計算,改變。

看乙個**改變一下求r(n),已知的是r(0)。

**如下:

#include#includeusing namespace std;  

int temp[5][5],temp1[5][5];

void exchange(int sum,int k)

} for(int i=1;i<=sum;i++)

} }

int main()

} exchange(sum,1);

cout<

執行結果如下:

請輸入你的矩陣邊數:

4請輸入各邊的關係:

0 1 0 0

0 0 1 1

1 1 0 1

1 0 0 0

r(1)的傳遞閉包關係圖如下:

0 1 0 0

0 0 1 1

1 1 0 1

1 1 0 0

r(2)的傳遞閉包關係圖如下:

0 1 1 1

0 0 1 1

1 1 1 1

1 1 1 1

r(3)的傳遞閉包關係圖如下:

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

r(4)的傳遞閉包關係圖如下:

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

--------------------------------

process exited after 18.12 seconds with return value 0

請按任意鍵繼續. . .

離散複習資料之一(Fleury演算法)

下面介紹一下 什麼叫做尤拉迴路?尤拉迴路 有一條路從開始的位置到結束的位置都是同乙個位置,經過了所有的點且通過了所有的邊,通過的次數只能一次。比如著名的 哥尼斯堡七橋問題 尤拉路 在尤拉迴路的基礎上面改乙個條件。就是有一條路使得從開始的位置到結束的位置不是乙個位置。總結 具有一條經過所有邊的簡單迴路...

Oracle複習之一

oracle7 以前用varchar不支援國際化 varchar2支援 查詢語句 dml 資料操作語言 ddl 資料定義語言 select select from emp select ename,sal 12 from emp select 2 3 from dual dual 表就一條記錄 乙個...

Spark複習之一

rdd 只支援粗粒度轉換,即在大量記錄上執行的單個操作。將建立 rdd 的一系列 lineage 血統 記錄下來,以便恢復丟失的分割槽。rdd 的 lineage 會記錄 rdd 的元資料資訊和轉 換行為,當該 rdd 的部分分割槽資料丟失時,它可以根據這些資訊來重新運算和恢復丟失的 資料分割槽。r...