Hey我的编程小伙伴们👋,今天我要和大家分享一道我在LeetCode上遇到的超有趣的题目——编号3067的在带权树网络中统计可连接服务器对数目。这是一道非常适合练习DFS和图的题目哦!🤓💻
在我们深入题目之前,先来聊聊邻接图。邻接图是一种表示图的数据结构,它将每个节点的邻居节点(即与该节点直接相连的节点)组织在一起。简单来说,邻接图就是一种方式,让我们快速知道任意一个节点都和哪些节点相连。🌍
题目给出了一个无根带权树,树上有n
个节点,每个节点都是一个服务器。还有一个edges
数组,告诉我们哪些节点之间有连接以及连接的权重。🌐
关键的来了,我们需要找出所有可以通过某个中间节点c
连接的服务器对a
和b
。但不是随便哪个节点都能当中间人哦,要满足以下条件:
a < b
,且a
和b
都不能是c
。c
到a
和从c
到b
的距离都能被signalSpeed
整除。c
到a
和从c
到b
的路径不能有重叠的边。题目提示中n <= 1000
,这意味着我们可以考虑使用暴力枚举的策略。因为节点的数量不是非常大,所以对每个节点进行遍历和计算是可行的。
我们构建了一个邻接图来存储每个节点的连接信息。然后,通过深度优先搜索(DFS)遍历整棵树,计算每个节点作为中间节点时,能连接的服务器对的数目。🌳
在Scala中,我们使用了ArrayBuffer
来动态存储每个节点的邻居信息。DFS函数帮助我们递归地计算每个节点的贡献。最后,我们只需要遍历每个节点,累加它作为中间节点时能连接的服务器对数目。
import scala.collection.mutable.ArrayBuffer object Solution { def countPairsOfConnectableServers(edges: Array[Array[Int]], signalSpeed: Int): Array[Int] = { val n = edges.length + 1 val graph = Array.fill(n)(ArrayBuffer[(Int, Int)]()) for (e <- edges) { graph(e(0)) += ((e(1), e(2))) graph(e(1)) += ((e(0), e(2))) } def dfs(p: Int, root: Int, curr: Int): Int = { var res = 0 if (curr == 0) { res += 1 } for ((v, cost) <- graph(p)) { if (v != root) { res += dfs(v, p, (curr + cost) % signalSpeed) } } res } val res = new Array[Int](n) for (i <- 0 until n) { var pre = 0 for ((v, cost) <- graph(i)) { val cnt = dfs(v, i, cost % signalSpeed) res(i) += pre * cnt pre += cnt } } res } }
最终,我们得到了一个数组count
,其中count[i]
就是通过服务器i
可连接的服务器对的数目。
希望我的分享对你有所帮助,如果你有更好的解法或者想法,欢迎在评论区留言讨论哦!我们一起进步,一起加油!🚀🌈
编程路上,我们一起成长,一起探索未知!👩💻🌟
以上就是今天的分享啦,如果你喜欢这样的内容,记得点赞和关注我哦!我们下次见!😘✨
下一篇:如何从服务器bios清除磁盘数据