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 条评论