class DSU:
def __init__(self, V):
self.parent = [0] * V
self.rank = [0] * V
for i in range(V):
self.make_set(i)
def make_set(self, x):
self.parent[x] = x
self.rank[x] = 0
def find_set(self, x):
if self.parent[x] == x:
return x
else:
rep_x = self.find_set(self.parent[x])
self.parent[x] = rep_x # PATH COMPRESSION
return rep_x
def union(self, u, v):
rep_u = self.find_set(u)
rep_v = self.find_set(v)
if rep_u != rep_v:
# UNION BY RANK
if self.rank[rep_u] > self.rank[rep_v]:
self.parent[rep_v] = rep_u
elif self.rank[rep_v] > self.parent[rep_u]:
self.parent[rep_u] = rep_v
else:
self.parent[rep_v] = rep_u
self.rank[rep_u] += 1
def same_set(self, u, v):
rep_u = self.find_set(u)
rep_v = self.find_set(v)
if rep_u == rep_v:
return True
else:
return False
dsu = DSU(4)
dsu.union(0, 3)
dsu.union(3, 1)
print(dsu.parent)
print(dsu.same_set(1, 3))
Y2xhc3MgRFNVOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIFYpOgogICAgICAgIHNlbGYucGFyZW50ID0gWzBdICogVgogICAgICAgIHNlbGYucmFuayA9IFswXSAqIFYKICAgICAgICAKICAgICAgICBmb3IgaSBpbiByYW5nZShWKToKICAgICAgICAgICAgc2VsZi5tYWtlX3NldChpKQogICAgCiAgICBkZWYgbWFrZV9zZXQoc2VsZiwgeCk6CiAgICAgICAgc2VsZi5wYXJlbnRbeF0gPSB4CiAgICAgICAgc2VsZi5yYW5rW3hdID0gMAogICAgCiAgICBkZWYgZmluZF9zZXQoc2VsZiwgeCk6CiAgICAgICAgaWYgc2VsZi5wYXJlbnRbeF0gPT0geDoKICAgICAgICAgICAgcmV0dXJuIHgKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXBfeCA9IHNlbGYuZmluZF9zZXQoc2VsZi5wYXJlbnRbeF0pCiAgICAgICAgICAgIHNlbGYucGFyZW50W3hdID0gcmVwX3ggIyBQQVRIIENPTVBSRVNTSU9OCiAgICAgICAgICAgIHJldHVybiByZXBfeAogICAgCiAgICBkZWYgdW5pb24oc2VsZiwgdSwgdik6CiAgICAgICAgcmVwX3UgPSBzZWxmLmZpbmRfc2V0KHUpCiAgICAgICAgcmVwX3YgPSBzZWxmLmZpbmRfc2V0KHYpCiAgICAgICAgCiAgICAgICAgaWYgcmVwX3UgIT0gcmVwX3Y6CiAgICAgICAgICAgIAogICAgICAgICAgICAjIFVOSU9OIEJZIFJBTksKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIHNlbGYucmFua1tyZXBfdV0gPiBzZWxmLnJhbmtbcmVwX3ZdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJlbnRbcmVwX3ZdID0gcmVwX3UKICAgICAgICAgICAgZWxpZiBzZWxmLnJhbmtbcmVwX3ZdID4gc2VsZi5wYXJlbnRbcmVwX3VdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJlbnRbcmVwX3VdID0gcmVwX3YKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyZW50W3JlcF92XSA9IHJlcF91CiAgICAgICAgICAgICAgICBzZWxmLnJhbmtbcmVwX3VdICs9IDEKICAgIAogICAgZGVmIHNhbWVfc2V0KHNlbGYsIHUsIHYpOgogICAgICAgIHJlcF91ID0gc2VsZi5maW5kX3NldCh1KQogICAgICAgIHJlcF92ID0gc2VsZi5maW5kX3NldCh2KQogICAgICAgIAogICAgICAgIGlmIHJlcF91ID09IHJlcF92OgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIAoKZHN1ID0gRFNVKDQpCmRzdS51bmlvbigwLCAzKQpkc3UudW5pb24oMywgMSkKcHJpbnQoZHN1LnBhcmVudCkKCnByaW50KGRzdS5zYW1lX3NldCgxLCAzKSkK