带权重的并查集算法应用

关于并查集算法的应用
并查集算法应用

399. 除法求值

class Solution:
    def calcEquation(self, equations: List[List[str]], values: List[float], queries: List[List[str]]) -> List[float]:
        equationsSize = len(equations)
        uf = UnionFind(2 * equationsSize)

        # 第 1 步:预处理,将变量的值与 id 进行映射,使得并查集的底层使用数组实现,方便编码
        hashmap = dict()
        id = 0
        for i in range(equationsSize):
            equation = equations[i]
            var1 = equation[0]
            var2 = equation[1]

            if var1 not in hashmap:
                hashmap[var1] = id
                id += 1
            
            if var2 not in hashmap:
                hashmap[var2] = id
                id += 1

            uf.union(hashmap.get(var1), hashmap.get(var2), values[i])

        # 第 2 步:做查询
        queriesSize = len(queries)
        res = [None] * queriesSize
        for i in range(queriesSize):
            var1 = queries[i][0]
            var2 = queries[i][1]

            id1 = hashmap.get(var1)
            id2 = hashmap.get(var2)

            if id1 is None or id2 is None:
                res[i] = -1.0
            else:
                res[i] = uf.isConnected(id1, id2)

        return res




class UnionFind:
    """
    并查集算法
    """
    def __init__(self, n):
        self.parent = [i for i in range(n)]
        self.cnt = n
        self.weight = [1.0 for _ in range(n)]

    
    def union(self, x, y, value):
        rootx = self.find(x)
        rooty = self.find(y)
        if rootx == rooty:
            return

        self.parent[rootx] = rooty
        self.weight[rootx] = self.weight[y] * value / self.weight[x]

    def find(self, x):
        if x != self.parent[x]:
            origin = self.parent[x]
            self.parent[x] = self.find(self.parent[x])
            self.weight[x] = self.weight[x] * self.weight[origin]

        return self.parent[x]

    def isConnected(self, x, y):
        rootx = self.find(x)
        rooty = self.find(y)

        if rootx == rooty:
            return self.weight[x] / self.weight[y]
        
        return -1


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP_wendi

谢谢您的支持。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值