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

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。

http://www.lryc.cn/news/2379480.html

相关文章:

  • 兼顾长、短视频任务的无人机具身理解!AirVista-II:面向动态场景语义理解的无人机具身智能体系统
  • springboot踩坑记录
  • SparkSQL基本操作
  • Web 架构之动静分离
  • 20250515配置联想笔记本电脑IdeaPad总是使用独立显卡的步骤
  • sparkSQL读入csv文件写入mysql
  • 大涡模拟实战:从区域尺度到街区尺度的大气环境模拟
  • centos安装方式的aarch64架构下的kylinv10安装docker23.0.0
  • 单目测距和双目测距 bev 3D车道线
  • 鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp
  • 【爬虫】DrissionPage-3
  • Web开发-JavaEE应用SpringBoot栈SnakeYaml反序列化链JARWAR构建打包
  • 项目复习(2)
  • UE 材质基础 第一天
  • 短剧小程序系统开发源码上架,短剧项目市场分析
  • 学习FineBI
  • Oracle日期计算跟Mysql计算日期差距问题-导致两边计算不一致
  • 深入剖析某App视频详情逆向:聚焦sig3参数攻克
  • Java求职面试揭秘:从Spring到微服务的技术挑战
  • 【Linux】Linux安装并配置MongoDB
  • HANA数据库死锁
  • STC32G12K128实战:串口通信
  • Kotlin Multiplatform与Flutter、Compose共存:构建高效跨平台应用的完整指南
  • ElasticSearch深入解析(十二):聚合——分桶聚合、指标聚合、管道子聚合
  • spark小任务
  • Ubuntu 20.04 报错记录: Matplotlib 无法使用 OpenCV 的 libqxcb.so
  • JS 高级程序设计 设计模式
  • 新电脑软件配置二:安装python,git, pycharm
  • 数据仓库:企业数据管理的核心引擎
  • MCU开发学习记录17* - RTC学习与实践(HAL库) - 日历、闹钟、RTC备份寄存器 -STM32CubeMX