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
defunion
(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之間是否連通,如果兩個節點的父節點是相同的,那麼就是連通的
defconnected
(self, p, q)
: rootp = self.find(p)
rootq = self.find(q)
return rootp == rootq
# 返回有多少個群
defcount
(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。
defuf
(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的演算法小抄。
python實現並查集
並查集是這樣的資料結構 有一大堆的資料,把一些元素放在乙個集合當中,另外一些元素放在另乙個乙個集合當中。對於它的操作有 檢視兩個元素是否在乙個集合當中 合併兩個元素。合併的時候採取的策略是這樣的 將兩個元素所在的集合的所有元素一起放入乙個集合當中。這裡使用兩個字典來實現並查集 乙個字典儲存當前節點的...
並查集 並查集
本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...
java實現並查集
並查集是根據這篇博文學習的,寫得很不錯 下面是實現 public class unionfindset count n 合併p,q所在集合 param p param q public void union int p,int q if size rootp size rootq else coun...