@@ -72,8 +72,9 @@ def union(self, p, q):
7272``` python
7373class UF :
7474 parent = {}
75- def __init__ (self , equations ):
76- # 做一些初始化操作
75+ cnt = 0
76+ def __init__ (self , M ):
77+ # 初始化 parent 和 cnt
7778
7879 def find (self , x ):
7980 while x != self .parent[x]:
@@ -82,6 +83,7 @@ class UF:
8283 def union (self , p , q ):
8384 if self .connected(p, q): return
8485 self .parent[self .find(p)] = self .find(q)
86+ self .cnt -= 1
8587 def connected (self , p , q ):
8688 return self .find(p) == self .find(q)
8789```
@@ -91,15 +93,27 @@ class UF:
9193``` python
9294class UF :
9395 parent = {}
94- def __init__ (self , equations ):
95- # 做一些初始化操作
96+ size = {}
97+ cnt = 0
98+ def __init__ (self , M ):
99+ # 初始化 parent,size 和 cnt
100+
96101 def find (self , x ):
97- if x != self .parent[x]:
98- parent[x] = find(parent[x])
99- return parent[x]
102+ while x != self .parent[x]:
103+ x = self .parent[x]
104+ # 路径压缩
105+ self .parent[x] = self .parent[self .parent[x]];
106+ return x
100107 def union (self , p , q ):
101108 if self .connected(p, q): return
102- self .parent[self .find(p)] = self .find(q)
109+ # 小的树挂到大的树上, 使树尽量平衡
110+ leader_p = self .find(p)
111+ leader_q = self .find(q)
112+ if self .size[leader_p] < self .size[leader_q]:
113+ self .parent[leader_p] = leader_q
114+ else :
115+ self .parent[leader_q] = leader_p
116+ self .cnt -= 1
103117 def connected (self , p , q ):
104118 return self .find(p) == self .find(q)
105119```
0 commit comments