Kimi    LeetCode 3515. 带权树中的最短路径 C语言实现
这是 LeetCode 3515「带权树中的最短路径」的 C 语言实现采用 DFS 欧拉序 线段树区间加、单点查 的经典做法并使用迭代 DFS 避免链状树递归栈溢出。---核心思路1. 以 1 为根 DFS记录每个节点的进入时间 tin[i]、离开时间 tout[i] 和到根的初始距离 dist[i]。2. 子树 连续区间节点 i 的子树中所有节点的时间戳落在 [tin[i], tout[i]]。3. 修改边权 (u, v)tin 较大的节点是子节点 child该边权变化 delta 会影响 child 整个子树到根的距离即对区间 [tin[child], tout[child]] 整体加 delta。4. 线段树维护区间加、单点查。查询节点 x 时返回位置 tin[x] 的值即可。---C 代码c#include stdlib.h/* 线段树区间加、单点查懒标记不下传查询时累加 */typedef struct {long long *lazy;int n;} SegTree;static SegTree* segCreate(int n) {SegTree *s malloc(sizeof(SegTree));s-n n;s-lazy calloc(4 * n 4, sizeof(long long));return s;}static void segFree(SegTree *s) {free(s-lazy);free(s);}/* 区间 [ql,qr] 增加 val */static void segAdd(SegTree *s, int idx, int l, int r, int ql, int qr, long long val) {if (qr l || r ql) return;if (ql l r qr) {s-lazy[idx] val;return;}int mid (l r) 1;segAdd(s, idx 1, l, mid, ql, qr, val);segAdd(s, idx 1 | 1, mid 1, r, ql, qr, val);}/* 单点查询 */static long long segQuery(SegTree *s, int idx, int l, int r, int pos) {long long res s-lazy[idx];if (l r) return res;int mid (l r) 1;if (pos mid) res segQuery(s, idx 1, l, mid, pos);else res segQuery(s, idx 1 | 1, mid 1, r, pos);return res;}/* 邻接表 */typedef struct Edge {int to, w;struct Edge *next;} Edge;/* 全局 DFS 变量 */static int *tin, *tout, timestamp;static long long *dist;/* 迭代 DFS防止链状树 1e5 层递归栈溢出 */static void dfs(Edge **g, int n) {typedef struct {int u, fa;long long d;Edge *next;int state; /* 0首次进入, 1处理完子节点 */} Stk;Stk *stk malloc((n 1) * sizeof(Stk));int top 0;stk[top] (Stk){1, 0, 0, g[1], 0};while (top 0) {Stk *cur stk[top - 1];int u cur-u;if (cur-state 0) {tin[u] timestamp;dist[u] cur-d;cur-state 1;}/* 跳过指向父节点的边 */while (cur-next cur-next-to cur-fa)cur-next cur-next-next;if (cur-next) {Edge *e cur-next;cur-next e-next;stk[top] (Stk){e-to, u, cur-d e-w, g[e-to], 0};} else {tout[u] timestamp;top--;}}free(stk);}/* LeetCode 接口 */int* treeQueries(int n, int** edges, int edgesSize, int* edgesColSize,int** queries, int queriesSize, int* queriesColSize,int* returnSize) {tin malloc((n 1) * sizeof(int));tout malloc((n 1) * sizeof(int));dist malloc((n 1) * sizeof(long long));Edge **g calloc(n 1, sizeof(Edge*));/* 建无向图 */for (int i 0; i edgesSize; i) {int u edges[i][0], v edges[i][1], w edges[i][2];Edge *e1 malloc(sizeof(Edge));e1-to v; e1-w w; e1-next g[u]; g[u] e1;Edge *e2 malloc(sizeof(Edge));e2-to u; e2-w w; e2-next g[v]; g[v] e2;}/* 求 tin / tout / dist */timestamp 0;dfs(g, n);/* 线段树单点初始化 dist */SegTree *seg segCreate(n);for (int i 1; i n; i)segAdd(seg, 1, 1, n, tin[i], tin[i], dist[i]);int *ans malloc(queriesSize * sizeof(int));int cnt 0;for (int i 0; i queriesSize; i) {if (queries[i][0] 1) { /* 修改边权 */int u queries[i][1], v queries[i][2], newW queries[i][3];int oldW 0;/* 读取旧权值并更新邻接表 */for (Edge *e g[u]; e; e e-next)if (e-to v) { oldW e-w; e-w newW; break; }for (Edge *e g[v]; e; e e-next)if (e-to u) { e-w newW; break; }int delta newW - oldW;int child (tin[u] tin[v]) ? v : u; /* tin 大的是子节点 */segAdd(seg, 1, 1, n, tin[child], tout[child], delta);} else { /* 查询到根距离 */int x queries[i][1];ans[cnt] (int)segQuery(seg, 1, 1, n, tin[x]);}}/* 释放内存 */segFree(seg);free(tin); free(tout); free(dist);for (int i 1; i n; i) {Edge *e g[i];while (e) { Edge *tmp e; e e-next; free(tmp); }}free(g);*returnSize cnt;return ans;}---关键点说明要点 说明迭代 DFS 显式栈实现避免链状树递归深度 1e5 导致栈溢出。判断父子 tin[u] tin[v] 说明 u 先被访问v 在 u 的子树中因此 v 是子节点。懒标记线段树 懒标记不下传查询时累加根到叶子路径上的所有标记天然支持区间加、单点查。边权更新 直接遍历 u、v 的邻接表找到对方读取旧值、更新新值无需额外哈希数组。---复杂度- 时间O((n q) log n) — DFS O(n)每次查询/修改线段树 O(log n)。- 空间O(n) — 邻接表、线段树、时间戳数组等。

相关新闻

3分钟搞定B站视频永久保存:m4s-converter开源工具使用指南

3分钟搞定B站视频永久保存:m4s-converter开源工具使用指南

3分钟搞定B站视频永久保存:m4s-converter开源工具使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾因B站视频突然下架…

2026/7/9 8:40:22阅读更多 →
2026年,你还在用OA软件管工程项目吗?

2026年,你还在用OA软件管工程项目吗?

在数字化转型的浪潮中,许多工程企业为了追求“办公一体化”,试图用OA系统(如FW、ZY、LL)来替代专业的工程项目管理软件。然而,在实际落地时,不少项目经理却叫苦连天:进度依然失控,成…

2026/7/9 8:40:22阅读更多 →
5分钟解锁加密音乐:让你的音乐在任何设备自由播放

5分钟解锁加密音乐:让你的音乐在任何设备自由播放

5分钟解锁加密音乐:让你的音乐在任何设备自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://g…

2026/7/9 8:40:22阅读更多 →
架构验证:怎么知道架构设计得好不好

架构验证:怎么知道架构设计得好不好

架构验证:怎么知道架构设计得好不好 开篇:设计得好不好,验证一下才知道 张三设计了一款手机,工厂生产出来了。 怎么知道设计得好不好? 验证! 跌落测试:摔一下会不会碎 续航测试:能用多久 性能测试:跑分多少 用户测试:用户喜不喜欢 架构设计也一样,需要验证。 什…

2026/7/9 9:50:40阅读更多 →
Linux 7.1 发布,Linus Torvalds 谈内核开发、Rust 应用与 AI 影响

Linux 7.1 发布,Linus Torvalds 谈内核开发、Rust 应用与 AI 影响

Linux 7.1 发布与对话背景近日,Linux、Git 之父 Linus Torvalds 现身印度孟买,在与 Verizon 开源项目办公室负责人 Dirk Hohndel 展开的围炉式深度对话中表示,“我完全不反对 Rust,但我也希望降低大家对它的期待,不要认…

2026/7/9 9:50:40阅读更多 →
TISAX版本切换:从 ISA6.0 到 ISA2027

TISAX版本切换:从 ISA6.0 到 ISA2027

2026 年 7 月 1 日,VDA 与 ENX 正式发布 TISAX 新版评估标准ISA2027,宣告现行 ISA6.0 版本生命周期进入倒计时。新版标准将于 2027 年 1 月 1 日强制实施,并确立以发布年份命名的年度迭代机制。这不仅是版本号的更替,更是汽车信息…

2026/7/9 9:50:40阅读更多 →
Codex进化:从代码助手到工作系统

Codex进化:从代码助手到工作系统

导读: 很多人第一次用 Codex,还是把它当成「更会写代码的 ChatGPT」:看仓库、改 diff、跑测试、提 PR。真正有意思的变化,是 Codex 的边界正在往外推:当浏览器、邮件、日程、MCP、桌面 GUI、自动化都接进来之后&#x…

2026/7/9 9:50:40阅读更多 →
MTK 免授权刷机实战:3种工具方案对比与小米/红米机型实测

MTK 免授权刷机实战:3种工具方案对比与小米/红米机型实测

MTK芯片深度刷机全指南:从工具选型到实战避坑 对于使用联发科(MTK)芯片的安卓设备用户而言,掌握底层刷机技术无异于获得了一把"万能钥匙"。无论是系统崩溃无法启动的"砖机"救援,还是突破厂商限制进…

2026/7/9 9:50:40阅读更多 →
Skill是什么?—— 从概念到应用场景的全面解析

Skill是什么?—— 从概念到应用场景的全面解析

1. 什么是 Skill?Skill,中文常译为“技能”或“能力”,是一个广泛用于描述个人或系统所具备的、通过学习和实践获得的、能够有效完成特定任务或解决特定问题的能力集合。在技术领域,尤其是在人工智能、软件开发、产品设计和项目管…

2026/7/9 9:45:40阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/8 13:42:39阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/8 13:42:39阅读更多 →