<gh_stars>0
# coding=utf-8
# author=uliontse


class UnionFind:
    def __init__(self, size):
        self.root = list(range(size))
        self.rank = [1] * size

    def find(self, id):
        """路径压缩 优化：把同一集合的索引结点都更新为根结点"""
        if id == self.root[id]:
            return id
        self.root[id] = self.find(self.root[id])
        return self.root[id]

    def union(self, id1, id2):
        """按秩合并 优化：同一集合不再是非常深的结构"""
        node1, node2 = self.find(id1), self.find(id2)
        if node1 != node2:
            if self.rank[node1] > self.rank[node2]:
                self.root[node2] = node1
            if self.rank[node1] < self.rank[node2]:
                self.root[node1] = node2
            else:
                self.root[node2] = node1
                self.rank[node1] += 1
        return

    def is_connected(self, id1, id2):
        return self.find(id1) == self.find(id2)



# coding=utf-8
# author=uliontse


class UnionFind:
    def __init__(self, size):
        self.root = list(range(size))
        self.rank = [1] * size

    def find(self, id):
        """路径压缩 优化：把同一集合的索引结点都更新为根结点"""
        if id == self.root[id]:
            return id
        self.root[id] = self.find(self.root[id])
        return self.root[id]

    def union(self, id1, id2):
        """按秩合并 优化：同一集合不再是非常深的结构"""
        node1, node2 = self.find(id1), self.find(id2)
        if node1 != node2:
            if self.rank[node1] > self.rank[node2]:
                self.root[node2] = node1
            if self.rank[node1] < self.rank[node2]:
                self.root[node1] = node2
            else:
                self.root[node2] = node1
                self.rank[node1] += 1
        return

    def is_connected(self, id1, id2):
        return self.find(id1) == self.find(id2)
# coding=utf-8 # author=uliontse 路径压缩 优化：把同一集合的索引结点都更新为根结点 按秩合并 优化：同一集合不再是非常深的结构