当前位置: 首页 > news >正文

Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II

  • Leetcode 3553. Minimum Weighted Subgraph With the Required Paths II
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3553. Minimum Weighted Subgraph With the Required Paths II

1. 解题思路

这一题很惭愧,并没有自力搞定,是看了大佬们的解答才有了思路,然后还没有做出来,最后最核心的内容是问了deepseek搞定的,发现是一个经典算法,也算是涨姿势了……

言归正传,这一题要求包含给定的三个点的最小子树的距离,事实上我们只需要分别求出任意其中两点的距离,然后三者相加除以2即是我们的答案了。

因此,问题就变成了如何求树当中任意两点的距离。而这个,我们事实上也只需要指定树的一个根节点,那么任意两个点的距离事实上就是这两个点分别关于这个根节点的距离之和减去他们的最小公共父节点到根节点的距离的两倍即可求得。

于是乎,我们的问题就只剩下如何求一个树上任意两个点的最小公共父节点了。我最开始是通过暴力解法来的,但这样的话单次query的时间复杂度就是 O ( N ) O(N) O(N)了,最终导致了整体代码的超时,问了一下deepseek之后发现求树的最小公共父节点事实上是一个非常经典的算法,虽然我还没完全看懂,不过copy了一下deepseek给到的算法实现之后,上述题目倒是直接搞定了……

只能说,又双叒叕是被deepseek完虐的一天,唉……

2. 代码实现

给出python代码实现如下:

class LCA:def __init__(self, root, tree):self.max_level = 20  # 根据树的高度调整self.parent = defaultdict(lambda: [-1]*self.max_level)self.depth = {}self.preprocess(root, tree)def preprocess(self, root, tree):stack = [(root, -1, 0)]  # (node, parent, depth)while stack:node, par, d = stack.pop()self.depth[node] = dself.parent[node][0] = parfor k in range(1, self.max_level):if self.parent[node][k-1] != -1:self.parent[node][k] = self.parent[self.parent[node][k-1]][k-1]for child in tree[node]:if child != par:stack.append((child, node, d+1))def query(self, u, v):if self.depth[u] < self.depth[v]:u, v = v, u# 对齐深度for k in range(self.max_level-1, -1, -1):if self.depth[u] - (1 << k) >= self.depth[v]:u = self.parent[u][k]if u == v:return u# 同步跳转for k in range(self.max_level-1, -1, -1):if self.parent[u][k] != -1 and self.parent[u][k] != self.parent[v][k]:u = self.parent[u][k]v = self.parent[v][k]return self.parent[u][0]class Solution:def minimumWeight(self, edges: List[List[int]], queries: List[List[int]]) -> List[int]:n = len(edges)graph = defaultdict(list)for u, v, w in edges:graph[u].append((v, w))graph[v].append((u, w))seen = {0}parents = defaultdict(int)dist = defaultdict(int)tree = defaultdict(list)parents[0] = -1q = [(0, 0)]while q:d, u = q.pop(0)for v, w in graph[u]:if v in seen:continueseen.add(v)tree[u].append(v)parents[v] = udist[v] = d + wq.append((d+w, v))lca = LCA(0, tree)def get_dist(u, v):p = lca.query(u, v)return dist[u] + dist[v] - 2*dist[p]def query(u, v, w):return (get_dist(u, v) + get_dist(u, w) + get_dist(v, w)) // 2return [query(u, v, w) for u, v, w in queries]

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

相关文章:

  • EMQX开源版安装指南:Linux/Windows全攻略
  • 初学c语言15(字符和字符串函数)
  • 【图像生成大模型】Wan2.1:下一代开源大规模视频生成模型
  • windows笔记本连接RKNN3588网络配置解析
  • jvm安全点(四)openjdk17 c++源码垃圾回收之安全点轮询页内存设置不可访问
  • 李臻20242817_安全文件传输系统项目报告_第12周
  • 【Java ee初阶】jvm(3)
  • ARM A64 STR指令
  • Java大厂面试:从Web框架到微服务技术的场景化提问与解析
  • Java基础知识总结(超详细整理)
  • 发布时将多个bpl 打包成一个bpl的方法,或者说:不需要vcl60.bpl情况下 18.5K的exe 照常可以运行。
  • c++学习之--- list
  • Nordic 的RTC(Real-time counter)的介绍
  • 虚幻引擎5-Unreal Engine笔记之Default Pawn与GamMode、Camera的关系
  • IDE/IoT/搭建物联网(LiteOS)集成开发环境,基于 VSCode + IoT Link 插件
  • SQL脚本规范
  • 【OpenCV基础 1】几何变换、形态学处理、阈值分割、区域提取和脱敏处理
  • 2025.5.12-2025.5.18:开始练习英语口语
  • httpx[http2] 和 httpx 的核心区别及使用场景如下
  • 01 Nginx安装及基本配置
  • 调查丨永久基本农田沦为垃圾堆场,整改为何成“纸面工程”?
  • 上海位居全球40城科技传播能力第六名
  • 林诗栋/蒯曼混双取胜,国乒赢得多哈世乒赛开门红
  • 下辖各区密集“联手”,南京在下一盘什么样的棋?
  • 河南一县政府党组成员签订抵制违规吃喝问题承诺书,现场交给县长
  • 特朗普称即将与伊朗达成核协议,外交部:中方愿继续发挥建设性作用