Leetcode 3067. Count Pairs of Connectable Servers in a Weighted Tree Network

本文介绍了如何解决LeetCode问题3067,通过深度优先搜索计算在加权树网络中,信号速度可整除的连接服务器对数。作者采用暴力求解策略,详细展示了代码实现,包括使用Python编写的DFS算法和计数计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 解题思路

这一题没想到什么好的方法,走的是暴力求解的路子。

整体的思路上其实还是比较直接的,就是考察所有的节点作为根节点时的单项路径,然后筛选出其中所有的和可以被signalSpeed整除的路径数目,最后求一下两两组合的对数即可。

其中,前者可以通过一个深度优先遍历进行实现;而后者事实上就是如下公式:

s = ∑ i < j x i ⋅ x j = 1 2 ⋅ ∑ i x i ⋅ ( ∑ j ≠ i x j ) = 1 2 ⋅ ∑ i x i ⋅ ( ∑ j x j − x i ) \begin{aligned} s &= \sum\limits_{i < j} x_i \cdot x_j \\ &= \frac{1}{2} \cdot \sum\limits_{i} x_i \cdot (\sum\limits_{j \neq i} x_j) \\ &= \frac{1}{2} \cdot \sum\limits_{i} x_i \cdot (\sum\limits_{j} x_j - x_i) \end{aligned} s=i<jxixj=21ixi(j=ixj)=21ixi(jxjxi)

因此,我们通过一重循环就能够快速地得到对应的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countPairsOfConnectableServers(self, edges: List[List[int]], signalSpeed: int) -> List[int]:
        n = len(edges)+1
        graph = defaultdict(list)
        for u, v, w in edges:
            graph[u].append((v, w))
            graph[v].append((u, w))

        @lru_cache(None)
        def dfs(u, pre, distance):
            ans =  1 if distance == 0 else 0
            for v, w in graph[u]:
                if v == pre:
                    continue
                ans += dfs(v, u, (distance + w) % signalSpeed)
            return ans
        
        def count_connectable(u):
            cnt = [dfs(v, u, w % signalSpeed) for v, w in graph[u]]
            s = sum(cnt)
            ans = sum([x * (s-x) for x in cnt]) // 2
            return ans
        
        return [count_connectable(u) for u in range(n)] 

提交代码评测得到:耗时292ms,占用内存38.7MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值