我們先對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...