0
点赞
收藏
分享

微信扫一扫

Python - 并查集

问题:现在有10**7个用户,编号为1- 10**7,现在已知有m对关系,每一对关系给你两个数x和y,代表编号为x的用户和编号为y的用户是在一个圈子中,例如:A和B在一个圈子中,B和C在一个圈子中,那么A,B,C就在一个圈子中。现在想知道最多的一个圈子内有多少个用户。 利用并查集来解决:

class UnionFind(object):
    def __init__(self):    
        self.parent=[i for i in range(10**7+1)]
        self.parentnums=[1]*(10**7+1)
    
def find(self,x):
        while x!=self.parent[x]:
            self.parent[x]=self.parent[self.parent[x]]  #路径压缩
            x=self.parent[x]
        return x
	 def union(self,x,y):
        rootx=self.find(x)
        rooty=self.find(y)
        if rootx==rooty:
            return
        self.parent[rooty]=rootx
        self.parentnums[rootx]+=self.parentnums[rooty]
 
if __name__=='__main__':
    T=int(input())
    for _ in range(T):
        n=int(input())
        uf=UnionFind()
        params=[]
        for _ in range(n):
            params=list(map(int,input().split()))
            x,y=int(params[0]),int(params[1])
            uf.union(x,y)
        maximum=0
        for i in range(1,len(uf.parentnums)):
            maximum=max(maximum,uf.parentnums[i])
        print(maximum)       
举报

相关推荐

0 条评论