并查集,一種特殊的資料結構(它的邏輯結構本質也是一顆“樹”,有唯一的根節點,任意數的子節點),它的特殊在于它隻定義了兩種資料操作(查找和合并)。這是用來解決連通性問題,查找(find):就是查找任意兩個節點是否連通,就是是否有共同的祖先(節點找它的父節點的過程,一層一層地找)。合并(union):把兩個不同集合的節點合并在一起。
剛開始看到并查集這個詞的時候,以為它是一個算法。其實也可以說是一個算法(對樹問題的一種特殊操作方式),隻不過這個算法的代碼實作通常要定義兩個函數:find()和union()
我定義了一個parent[n]數組,數組下标是每個節點的編号,存儲的值是每個節點的父節點
def find(i:int):
if parent[i] == i:
'''i節點的父節點是自己,也就是找到了根'''
return i
else:
"""使用遞歸,一層一層往上找,直到樹的根節點"""
return find(parent[i])
def union():
'''根據問題來确定怎樣合并
确定哪個來做根節點
問題初始化的時候,一般每個節點都是自己的根節點
根據問題選符合條件的其中一個做根節點(唯一)
最後就是建“樹”了,把符合條件的節點進行:parent[i]=j , j是父節點,i是子節點'''