寻找圈子最多人数——并查集解答

#定义并查集类
class UnionFind:
    def __init__(self, n):
        self.parents = list(range(n))  #初始化节点的父节点为其本身
        self.size = [1] * n     #初始化节点的深度为1
    def find(self, i):          #定义查找当前节点的父节点,如果不是根节点,则递归查找
        if self.parents[i] != i:
            self.parents[i] = self.find(self.parents[i])
        return self.parents[i]
    
    def union(self, i, j):     #合并,首先查找两个节点的父节点,如果不是同一个父节点则将其中一个节点变为另一个的子节点的,并将另一个节点的深度加上该节点的深度
        p1, p2 = self.find(i), self.find(j)
        if p1 != p2:
            self.parents[p1] = p2
            self.size[p2] += self.size[p1]
    
    def getMax(self):     #取最大深度
        return max(self.size)
    
def solution():    #问题解决
    n_t = int(input())
    for _ in range(n_t):
        n_p = int(input())
        pairs = []
        ori2cur = {}
        idx = 0
        for _ in range(n_p):
            x, y = map(int, input().split())
            for xy in [x, y]:
                if xy - 1 not in ori2cur:   #这块还没搞明白
                    ori2cur[xy-1] = idx
                    idx += 1
            pairs.append((ori2cur[x-1], ori2cur[y-1]))
        uf = UnionFind(idx)
        for a, b in pairs:
            uf.union(a, b)
        print(uf.getMax())
solution()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值