首先写下模版
def root(x):
if(p[x]!=x):
p[x]=root(p[x])
return p[x]
def union(x,y):
if(root(x)!=root(y)):
p[root(x)]=root(y)
然后在分析,发现有一点不太一样。。。
好像不太能用并查集,但是
它跟社交关系网很相似,最多1000个爱好,我们开始想到一个【1000】【】的二维数组,每个爱好里面记录下他的主人,后来因为太麻烦,又有可能爆空间。
于是,我们想到了: 只取一维的,每个里面只放入一个元素即可
每一次,和那一个元素union就行了
def root(x):
if(p[x]!=x):
p[x]=root(p[x])
return p[x]
def union(x,y):
if(root(x)!=root(y)):
p[root(x)]=root(y)
n=int(input())
p=[i for i in range(n+1)]
h=[0 for i in range(1001)]
for i in range(1,n+1):
b=list(map(int,input().split()[1:]))
for j in b:
if((h[j])==0):
h[j]=i
elif (i)!=h[j]:
union(i,h[j])
#print(i,h[j])
ss=[0 for i in range(1+n)]
ans=0
for ii in range(1,n+1):
ss[root(ii)]+=1
if(ss[root(ii)]==1):ans+=1
print(ans)
ss.sort(reverse=True)
for i in ss:
if(i!=0):print(i,end=' ')