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.rank[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(5)
dsu.union(0, 2)
print(dsu.same_set(0, 2))
Y2xhc3MgRFNVOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIFYpOgogICAgICAgIHNlbGYucGFyZW50ID0gWzBdICogVgogICAgICAgIHNlbGYucmFuayA9IFswXSAqIFYKICAgICAgICAKICAgICAgICBmb3IgaSBpbiByYW5nZShWKToKICAgICAgICAgICAgc2VsZi5tYWtlX3NldChpKQogICAgCiAgICBkZWYgbWFrZV9zZXQoc2VsZiwgeCk6CiAgICAgICAgc2VsZi5wYXJlbnRbeF0gPSB4CiAgICAgICAgc2VsZi5yYW5rW3hdID0gMAogICAgCiAgICBkZWYgZmluZF9zZXQoc2VsZiwgeCk6CiAgICAgICAgaWYgc2VsZi5wYXJlbnRbeF0gPT0geDoKICAgICAgICAgICAgcmV0dXJuIHgKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXBfeCA9IHNlbGYuZmluZF9zZXQoc2VsZi5wYXJlbnRbeF0pCiAgICAgICAgICAgIHNlbGYucGFyZW50W3hdID0gcmVwX3ggIyBQYXRoIENvbXByZXNzaW9uCiAgICAgICAgICAgIHJldHVybiByZXBfeAogICAgCiAgICBkZWYgdW5pb24oc2VsZiwgdSwgdik6CiAgICAgICAgcmVwX3UgPSBzZWxmLmZpbmRfc2V0KHUpCiAgICAgICAgcmVwX3YgPSBzZWxmLmZpbmRfc2V0KHYpCiAgICAgICAgCiAgICAgICAgaWYgcmVwX3UgIT0gcmVwX3Y6CiAgICAgICAgICAgICMgVW5pb24gQnkgUmFuawogICAgICAgICAgICBpZiBzZWxmLnJhbmtbcmVwX3VdID4gc2VsZi5yYW5rW3JlcF92XToKICAgICAgICAgICAgICAgIHNlbGYucGFyZW50W3JlcF92XSA9IHJlcF91CiAgICAgICAgICAgIGVsaWYgc2VsZi5yYW5rW3JlcF92XSA+IHNlbGYucmFua1tyZXBfdV06CiAgICAgICAgICAgICAgICBzZWxmLnBhcmVudFtyZXBfdV0gPSByZXBfdgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJlbnRbcmVwX3ZdID0gcmVwX3UKICAgICAgICAgICAgICAgIHNlbGYucmFua1tyZXBfdV0gKz0gMQogICAgCiAgICBkZWYgc2FtZV9zZXQoc2VsZiwgdSwgdik6CiAgICAgICAgcmVwX3UgPSBzZWxmLmZpbmRfc2V0KHUpCiAgICAgICAgcmVwX3YgPSBzZWxmLmZpbmRfc2V0KHYpCiAgICAgICAgCiAgICAgICAgaWYgcmVwX3UgPT0gcmVwX3Y6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICAKZHN1ID0gRFNVKDUpCgpkc3UudW5pb24oMCwgMikKCgpwcmludChkc3Uuc2FtZV9zZXQoMCwgMikpCgoK