<離散數學><基礎>求傳遞閉包的warshall算法


 ————————————————————————————

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* = R∪ R∪ R∪ ...... ∪ 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


免責聲明!

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



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