class unionfind:
def __init__(self):
self.co = 0 # 用於記錄群的個數
self.parent = # 索引是每個節點本身,值是每個節點的父節點
self.size = # 用於記錄每個群的節點數目
#def find(self, x):
while self.parent[x] != x:
# self.parent[x] = self.parent[self.parent[x]] # 用於路徑壓縮
x = self.parent[x]
return x
def union(self, p, q):
rootp = self.find(p)
rootq = self.find(q)
if rootp == rootq:
return
# 下面的這個if語句用將節點數少的合併到節點數多的群中
if self.size[rootp] > self.size[rootq]:
self.parent[rootq] = rootp
self.size[rootp] += self.size[rootq]
else:
self.parent[rootp] = rootq
self.size[rootq] += self.size[rootp]
self.co -= 1
# 用於判斷p和q之間是否連通,如果兩個節點的父節點是相同的,那麼就是連通的
def connected(self, p, q):
rootp = self.find(p)
rootq = self.find(q)
return rootp == rootq
# 返回有多少個群
def count(self):
return self.co
# 初始化,節點的父節點就是其本身,假設n=10,那麼就有10個群,self.parent=[0,1,2,3,4,5,6,7,8,9],self.parent[0]=0表示0節點的父節點是0。每個群的size,也就是包含的節點數目就是1,self.size[0]=1。
def uf(self, n):
self.co = n
self.parent = [0 for _ in range(n)]
self.size = [0 for _ in range(n)]
for i in range(n):
self.parent[i] = i
self.size[i] = 1
unionf = unionfind()
unionf.uf(10)
print("初始化每個節點的父節點:", unionf.parent)
print("初始化的群個數:", unionf.count())
unionf.union(0, 3) # 0,3建立關係
unionf.union(3, 7) # 3,7建立關係
unionf.union(7, 9) # 7,9建立關係
unionf.union(2, 8) # 2,8建立關係
print("判斷{}與{}之間是否在乙個群裡面:{}".format(3, 8, unionf.connected(3, 8)))
print("返回節點{}的父節點{}".format(7, unionf.find(7)))
print("當前每個節點的父節點:", unionf.parent)
print("當前群的個數:", unionf.count())
print("當前每乙個群的節點個數:", unionf.size)
初始化每個節點的父節點: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
初始化的群個數: 10
判斷3與8之間是否在乙個群裡面:false
返回節點7的父節點3
當前每個節點的父節點: [3, 1, 8, 3, 4, 5, 6, 3, 8, 3]
當前群的個數: 6
當前每乙個群的節點個數: [1, 1, 1, 4, 1, 1, 1, 1, 2, 1]
更具體的介紹可以去參考labuladong的演算法小抄。
並查集 帶權並查集 種類並查集 入門基礎題
include include include include include include include includetypedef long long ll using namespace std const int inf 0x3f3f3f3f const int maxn 2e5 10...
並查集簡單題
題目傳送 poj 1611 the suspects ac include include include include include include include include include include include include include include define l...
並查集 題1
問題描述 今天是ignatius的生日。他邀請很多朋友。現在是晚餐時間。ignatius想知道他至少需要多少張桌子。你必須注意到,並不是所有的朋友都認識對方,所有的朋友都不想留在陌生人身上。這個問題的乙個重要規則是,如果我告訴你a知道b,b知道c,這意味著a,b,c彼此認識,所以他們可以留在乙個表中...