python實現並查集

2021-10-25 14:26:56 字數 2537 閱讀 7216

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...