并查集(python)

def find(x):  
    global fa  
   
    if x == fa[x]:  
        return x  
    else:  
        fa[x] = find(fa[x])  
        return fa[x]  
   
def merge(i,j):  
    global fa,rank  
   
    x = find(i)  
    y = find(j)  
    if rank[i] <= rank[j]:  
        fa[x] = y  
    else:  
        fa[y] = x  
   
    if rank[x] == rank[y] and x!= y:  
        rank[y] = rank[y]+1  
   
def f(n,m):  
       
    Rst = [0 for i in range(n+1)]  
    for i in range(m):  
        a,b,c = map(int,input().strip().split())  
        if a == 1:  
            merge(b,c)  
        elif a == 2:  
            for i in range(1,n+1):  
                if find(i) == find(b):  
                    Rst[i] = Rst[i]+c  
                       
    for i in range(1,n+1):  
        print(Rst[i],end=' ')  
       
       
if __name__ == '__main__':  
    n,m = map(int,input().strip().split())  
    fa = [i for i in range(n+1)]  
    rank = [1 for i in range(n+1)]  
    f(n,m)

银河战舰问题(并查集改编)

def find(x):
    global fa,size,dis
    
    if x == fa[x]:
        return x
    t1 = fa[x]
    t2 = find(t1)
    fa[x] = t2
    dis[x] = dis[x] + dis[t1]
    
    return t2

def merge(x,y):
    global fa,size,dis
    
    tx = find(x)
    ty = find(y)
    fa[tx] = ty
    dis[tx] = size[ty]
    size[ty] = size[ty]+size[tx]
    size[tx] = 0

def f(m):
    global fa,size,dis
    
    for i in range(m):
        order,x,y = input().strip().split()
        x = int(x)
        y = int(y)

        if order == 'M':
            merge(x,y)
        elif order == 'C':
            tx = find(x)
            ty = find(y)
            if tx != ty:
                print(-1)
            else:
                print(abs(dis[x]-dis[y])-1)                    
                   

if __name__ == '__main__':
    fa = [i for i in range(30001)]
    size = [1 for i in range(30001)]   #表示第i条队列有多少飞船
    dis = [0 for i in range(30001)]    #表示第i艘飞船距离队首多远
    m = int(input())
    f(m)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值