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

Kimi LeetCode 3515. 带权树中的最短路径 Python3实现

以下是 LeetCode 3515. 带权树中的最短路径 的完整 Python3 实现。

核心思路

与 Java/Rust 版本完全一致:
1. DFS 欧拉序:将每个节点的子树映射到连续区间 `[tin, tout]`
2. 懒标记线段树:区间修改(子树整体加 `delta`)+ 单点查询(节点到根距离)
3. 边权更新:通过 `parent` 数组确定子节点,仅更新子树区间

完整 Python3 代码

```python
from typing import List
from collections import defaultdict

class LazySegmentTree:
"""Lazy Segment Tree supporting range add and point query."""

def __init__(self, n: int):
self.n = n
self.tree = [0] * (4 * n)
self.lazy = [0] * (4 * n)

def _push(self, id: int, lo: int, hi: int) -> None:
"""Push lazy value down to children."""
if self.lazy[id] == 0:
return
self.tree[id] += self.lazy[id]
if lo != hi:
self.lazy[id * 2] += self.lazy[id]
self.lazy[id * 2 + 1] += self.lazy[id]
self.lazy[id] = 0

def add_range(self, l: int, r: int, val: int) -> None:
"""Add val to every element in range [l, r] (inclusive)."""
self._add_range(1, 0, self.n - 1, l, r, val)

def _add_range(self, id: int, lo: int, hi: int, l: int, r: int, val: int) -> None:
self._push(id, lo, hi)
if r < lo or l > hi:
return
if l <= lo and hi <= r:
self.lazy[id] += val
self._push(id, lo, hi)
return
mid = (lo + hi) // 2
self._add_range(id * 2, lo, mid, l, r, val)
self._add_range(id * 2 + 1, mid + 1, hi, l, r, val)

def query(self, i: int) -> int:
"""Query value at index i."""
return self._query(1, 0, self.n - 1, i)

def _query(self, id: int, lo: int, hi: int, i: int) -> int:
self._push(id, lo, hi)
if lo == hi:
return self.tree[id]
mid = (lo + hi) // 2
if i <= mid:
return self._query(id * 2, lo, mid, i)
return self._query(id * 2 + 1, mid + 1, hi, i)


class Solution:
def treeQueries(self, n: int, edges: List[List[int]], queries: List[List[int]]) -> List[int]:
# Build adjacency list
graph = [[] for _ in range(n + 1)]
edge_weight = {}

for u, v, w in edges:
graph[u].append((v, w))
graph[v].append((u, w))
edge_weight[(min(u, v), max(u, v))] = w

# Euler tour arrays
tin = [0] * (n + 1)
tout = [0] * (n + 1)
parent = [0] * (n + 1)
dist = [0] * (n + 1)

# DFS to compute Euler tour, parent, and initial distances
time = [0]

def dfs(u: int, prev: int) -> None:
tin[u] = time[0]
time[0] += 1
for v, w in graph[u]:
if v == prev:
continue
dist[v] = dist[u] + w
parent[v] = u
dfs(v, u)
tout[u] = time[0] - 1

dfs(1, 0)

# Build segment tree with initial distances
seg = LazySegmentTree(n)
for i in range(1, n + 1):
seg.add_range(tin[i], tin[i], dist[i])

# Process queries
ans = []
for q in queries:
if q[0] == 2:
# Query: shortest path from root to node x
x = q[1]
ans.append(seg.query(tin[x]))
else:
# Update: change edge (u, v) weight to new_w
u, v, new_w = q[1], q[2], q[3]
key = (min(u, v), max(u, v))
old_w = edge_weight[key]
delta = new_w - old_w
edge_weight[key] = new_w

# Determine which node is the child (deeper in the tree)
child = v if parent[v] == u else u

# Update all nodes in child's subtree
seg.add_range(tin[child], tout[child], delta)

return ans
```

Python3 特有注意点

要点 说明
嵌套函数 DFS 使用闭包捕获外部变量(`time`, `tin`, `tout` 等),无需手动传参
线段树实现 用下划线前缀命名私有方法(`_push`, `_add_range`, `_query`)
边权存储 `dict` 存储无向边,键为有序元组 `(min(u, v), max(u, v))`
可变整数 `time` 用单元素列表 `[0]` 实现闭包内可变引用

复杂度

- 时间复杂度:`O((n + q) log n)`
- 空间复杂度:`O(n)`

下载文件:[LeetCode3515_ShortestPathInWeightedTree.py](sandbox:///mnt/agents/output/LeetCode3515_ShortestPathInWeightedTree.py)

http://www.jsqmd.com/news/1153455/

相关文章:

  • 用 Cursor 规则文件统一团队编码规范:从约定到强制的工程实践
  • Claude Code与Vibecoding实战指南:从零构建AI编程助手工作流
  • Citrus:Java 集成测试的老牌框架
  • HTML初相识:从零搭建网页结构
  • React useMemo/useCallback 的滥用重灾区与正确使用边界
  • 深度学习图像去噪革命:DnCNN-PyTorch实战指南
  • 脑电入门(一)
  • 终极指南:GitHub工作流魔法将Linux应用移植到iOS世界
  • 智能游戏本地化实战:XUnity自动翻译器深度配置指南
  • 日常居家小酌选什么养生酒?复盛公六味地黄酒口感解析
  • Gitleaks实战指南:构建代码敏感信息自动化检测与防护体系
  • 如何通过ViGEmBus解决Windows游戏控制器兼容性问题:终极技术方案
  • ESP32双路FOC驱动技术深度解析:从设计哲学到工业实战完整指南
  • LangChain 学习笔记(二):Tool Calling、ToolMessage 与结构化输出到底怎么串起来
  • S7-200 SMART V3.0 以太网下载:3种IP配置方法与4步物理连接排查
  • CAD字体缺失的技术挑战与FontCenter自动化管理解决方案
  • FontCenter终极指南:3分钟解决AutoCAD字体缺失的完全免费方案
  • Certum 开源代码签名证书 2024 申请实战:个人身份+开源项目 7 步验证指南
  • 2026企业宽带公司热门排名 小微企业避坑指南整理
  • 柯尔嫚头面妆模式系统开发
  • Reset Windows Update Tool终极指南:3分钟修复Windows更新卡死问题
  • SaaS产品的技术架构陷阱:多租户、计费与隔离
  • 新西兰自驾必备丨驾照NZTA翻译认证件去哪办理?附线上24小时出件流程
  • LangChain输出解析器实战:从大模型输出到结构化数据的转化
  • Deb to IPA终极指南:如何3步将Linux应用移植到iOS设备
  • 5步实现高效小说下载:开源工具fanqienovel-downloader的实用解决方案
  • 从 Prompt 注入到防御:大模型输入安全的工程化检测链路
  • 如何快速搭建企业级AI数据标注平台:LabelLLM完整指南
  • TensorFlow 2.x 实现 Bi-LSTM/Bi-GRU:5 个关键超参数调优与避坑指南
  • Fable AI技术重塑公共领域电影:AI视频生成与版权合规实践