————————————————————————————
Question:R是定義於集合S上的二元關系,求R的傳遞閉包。
Input:relation R,set A
Output:t(R),which is the transitive closure of R
Solution:Warshall algorithm
————————————————————————————
傳遞閉包(transitive closure) R* = R1 ∪ R2 ∪ R3 ∪ ...... ∪ Rn
解釋一下,關系R的傳遞閉包也是一個關系,可以用R*表示也可以用t(R)表示。
說實話離散數學課講這里的時候我沒在聽,后來小測考了錯了也沒去補漏。最近這兩天跟顧雨軒在教學樓黑板上討論復習,討論到了warshall算法,就整理整理了思路,寫了下來這些。
Warshall算法是這樣工作的:
首先我們把R用矩陣表示出來,
然后從第一列開始逐列遍歷,對於第i列,從上到下遍歷每個元素,
如果第i列第j行的元素為1,則將第i行對應着加到第j行上。
python模擬代碼:
#假定二維數組R的第一個下標為行標,第二個下標為列標。
def warshall(R):
n = size(R)
for i in range(0,n-1):
for j in range(0,n-1):
if R[j][i]==1:
R[j][:]+=R[i][:]
return R