Skip to content

Instantly share code, notes, and snippets.

@davidrft
Created December 18, 2019 18:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save davidrft/0caeff1177fad6df1dbbbd3605e08f95 to your computer and use it in GitHub Desktop.
Save davidrft/0caeff1177fad6df1dbbbd3605e08f95 to your computer and use it in GitHub Desktop.
class UnionFind:
def __init__(self):
self.id = {}
self.size = {}
def setdefault(self, p: int):
self.id.setdefault(p, p)
self.size.setdefault(p, 1)
def root(self, i: int) -> int:
while i != self.id[i]:
# path compression
self.id[i] = self.id[self.id[i]]
i = self.id[i]
return i
def connected(self, p: int, q: int) -> bool:
return self.root(p) == self.root(q)
def union(self, p: int, q: int) -> None:
self.setdefault(p)
self.setdefault(q)
i = self.root(p)
j = self.root(q)
if i == j:
return
# make i always the smallest subtree
if self.size[i] > self.size[j]:
i, j = j, i
# weighting
self.id[i] = j
self.size[j] += self.size[i]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment