-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdisjoint_set.py
More file actions
36 lines (29 loc) · 816 Bytes
/
disjoint_set.py
File metadata and controls
36 lines (29 loc) · 816 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class DisjointSet:
def __init__(self, nSets):
self.Sets = [[i] for i in range(nSets)]
self.Cells = [i for i in range(nSets)]
self.nsets = nSets
def __iter__(self):
for s in self.Sets:
if s == None:
continue
yield s
def add(self, l):
if l == None:
l = len(self.Sets)
self.Sets.append([l])
self.Cells.append(l)
self.nsets += 1
def find(self, i):
return self.Cells[i]
def merge(self, i, j):
i = self.find(i)
j = self.find(j)
if i == j:
return i
self.Sets[i].extend(self.Sets[j])
for k in self.Sets[j]:
self.Cells[k] = i
self.Sets[j] = None
self.nsets -= 1
return i