DeepSeek    LeetCode 3559. 给边赋权值的方案数 II Rust实现
根据题目要求对于树中任意两个节点 u 和 v路径长度为 d边数使路径总代价为奇数的赋值方案数为 2^(d-1)。核心是快速求树上两点距离。Rust 实现使用二进制提升rustconst MOD: i64 1_000_000_007;impl Solution {pub fn assign_edge_weights(edges: VecVeci32, queries: VecVeci32) - Veci32 {let n edges.len() 1;// 1. 建图无向树let mut graph vec![Vec::new(); n];for e in edges {let u (e[0] - 1) as usize;let v (e[1] - 1) as usize;graph[u].push(v);graph[v].push(u);}// 2. 预处理深度和倍增表let log (n as f64).log2().ceil() as usize 1;let mut depth vec![0; n];let mut up vec![vec![0; log]; n];// DFS 迭代构建避免递归栈溢出let mut stack vec![(0, usize::MAX)];let mut parent vec![usize::MAX; n];let mut order Vec::new();while let Some((node, par)) stack.pop() {parent[node] par;order.push(node);for nei in graph[node] {if nei ! par {depth[nei] depth[node] 1;stack.push((nei, node));}}}// 初始化 up[0]for i in 0..n {up[i][0] if parent[i] usize::MAX { i } else { parent[i] };}// 构建倍增表for j in 1..log {for i in 0..n {up[i][j] up[up[i][j-1]][j-1];}}// 3. 预处理 2 的幂次let mut pow2 vec![1; n 1];for i in 1..n {pow2[i] (pow2[i-1] as i64 * 2 % MOD) as i32;}// 4. LCA 闭包let get_lca |mut u: usize, mut v: usize| - usize {if depth[u] depth[v] {std::mem::swap(mut u, mut v);}// 将 v 提升到与 u 同深度let mut diff depth[v] - depth[u];let mut j 0;while diff 0 {if diff 1 1 {v up[v][j];}diff 1;j 1;}if u v {return u;}// 同时提升for j in (0..log).rev() {if up[u][j] ! up[v][j] {u up[u][j];v up[v][j];}}up[u][0]};// 5. 处理查询let mut ans Vec::with_capacity(queries.len());for q in queries {let u (q[0] - 1) as usize;let v (q[1] - 1) as usize;let lca get_lca(u, v);let dist depth[u] depth[v] - 2 * depth[lca];let result if dist 0 { 0 } else { pow2[dist - 1] };ans.push(result);}ans}}优化版本使用 BFS 代替 DFSrustuse std::collections::VecDeque;const MOD: i64 1_000_000_007;impl Solution {pub fn assign_edge_weights(edges: VecVeci32, queries: VecVeci32) - Veci32 {let n edges.len() 1;// 1. 建图let mut graph vec![Vec::new(); n];for e in edges {let u (e[0] - 1) as usize;let v (e[1] - 1) as usize;graph[u].push(v);graph[v].push(u);}// 2. BFS 预处理let log (n as f64).log2().ceil() as usize 1;let mut depth vec![0; n];let mut up vec![vec![0; log]; n];let mut parent vec![usize::MAX; n];let mut queue VecDeque::new();queue.push_back(0);parent[0] 0;while let Some(node) queue.pop_front() {for nei in graph[node] {if parent[nei] usize::MAX {parent[nei] node;depth[nei] depth[node] 1;queue.push_back(nei);}}}// 初始化 up[0]for i in 0..n {up[i][0] parent[i];}// 构建倍增表for j in 1..log {for i in 0..n {up[i][j] up[up[i][j-1]][j-1];}}// 3. 预处理 2 的幂let mut pow2 vec![1; n 1];for i in 1..n {pow2[i] ((pow2[i-1] as i64 * 2) % MOD) as i32;}// 4. LCA 函数fn get_lca(mut u: usize, mut v: usize, depth: [usize], up: [Vecusize], log: usize) - usize {if depth[u] depth[v] {std::mem::swap(mut u, mut v);}// 提升 vlet mut diff depth[v] - depth[u];let mut j 0;while diff 0 {if diff 1 1 {v up[v][j];}diff 1;j 1;}if u v {return u;}for j in (0..log).rev() {if up[u][j] ! up[v][j] {u up[u][j];v up[v][j];}}up[u][0]}// 5. 处理查询let mut ans Vec::with_capacity(queries.len());for q in queries {let u (q[0] - 1) as usize;let v (q[1] - 1) as usize;let lca get_lca(u, v, depth, up, log);let dist depth[u] depth[v] - 2 * depth[lca];ans.push(if dist 0 { 0 } else { pow2[dist - 1] });}ans}}使用递归 DFS 的简洁版本rustconst MOD: i64 1_000_000_007;impl Solution {pub fn assign_edge_weights(edges: VecVeci32, queries: VecVeci32) - Veci32 {let n edges.len() 1;let mut graph vec![Vec::new(); n];for e in edges {let u (e[0] - 1) as usize;let v (e[1] - 1) as usize;graph[u].push(v);graph[v].push(u);}let log (n as f64).log2().ceil() as usize 1;let mut depth vec![0; n];let mut up vec![vec![0; log]; n];// 递归 DFS注意n 很大时可能栈溢出fn dfs(node: usize, parent: usize, graph: [Vecusize], depth: mut [usize], up: mut [Vecusize], log: usize) {up[node][0] parent;for j in 1..log {up[node][j] up[up[node][j-1]][j-1];}for nei in graph[node] {if nei ! parent {depth[nei] depth[node] 1;dfs(nei, node, graph, depth, up, log);}}}dfs(0, 0, graph, mut depth, mut up, log);let mut pow2 vec![1; n 1];for i in 1..n {pow2[i] ((pow2[i-1] as i64 * 2) % MOD) as i32;}queries.iter().map(|q| {let mut u (q[0] - 1) as usize;let mut v (q[1] - 1) as usize;// LCAif depth[u] depth[v] {std::mem::swap(mut u, mut v);}let mut diff depth[v] - depth[u];let mut j 0;while diff 0 {if diff 1 1 {v up[v][j];}diff 1;j 1;}if u ! v {for j in (0..log).rev() {if up[u][j] ! up[v][j] {u up[u][j];v up[v][j];}}u up[u][0];}let dist depth[q[0] as usize - 1] depth[q[1] as usize - 1] - 2 * depth[u];if dist 0 { 0 } else { pow2[dist - 1] }}).collect()}}完整测试代码ruststruct Solution;fn main() {// 测试用例 1let edges vec![vec![0, 1],vec![1, 2],vec![1, 3],vec![1, 4],vec![2, 5],];let queries vec![vec![2, 3],vec![0, 2],];let result Solution::assign_edge_weights(edges, queries);println!({:?}, result); // 输出: [8, 4]// 测试用例 2let edges vec![vec![1, 0],vec![0, 2],];let queries vec![vec![0, 1],];let result Solution::assign_edge_weights(edges, queries);println!({:?}, result); // 输出: [1]}复杂度分析操作 时间复杂度 空间复杂度预处理 O(n log n) O(n log n)单次查询 O(log n) O(1)总体 O((n q) log n) O(n log n)其中 n 为节点数q 为查询数。核心原理1. 路径长度为 d树上两点间的边数2. 方案数 2^(d-1)从 d 条边中选择奇数条赋值为 13. LCA 求距离dist(u,v) depth[u] depth[v] - 2*depth[lca]4. 快速幂预处理避免每次查询重复计算 2 的幂

相关新闻

android---控件---EditText

android---控件---EditText

属性部分1.滚动条(垂直) android:scrollbars"vertical"2.单行显示 android:singleLine"true"android:maxLines"1"3.设置-输入长度限制 android:maxLength"3" 4.设置-去除下划线 android:background"null" 5.显示…

2026/7/15 4:34:48 阅读更多 →
如何通过命令行工具快速识别可执行文件与动态库的架构与平台兼容性

如何通过命令行工具快速识别可执行文件与动态库的架构与平台兼容性

1. 为什么需要识别二进制文件的架构和平台?在跨平台开发时,我们经常会遇到这样的场景:明明在自己电脑上运行得好好的程序,放到服务器或嵌入式设备上就报错。这时候系统可能会提示"Exec format error"或者"wrong EL…

2026/7/15 4:34:48 阅读更多 →
QT C++系统托盘图标开发:从QSystemTrayIcon入门到实战优化

QT C++系统托盘图标开发:从QSystemTrayIcon入门到实战优化

1. 项目概述:为什么我们需要系统托盘图标?做Windows桌面应用开发,尤其是用C和QT框架,系统托盘图标(System Tray Icon)是一个绕不开的实用功能。它不仅仅是右下角的一个小图标那么简单。想想你常用的那些软件…

2026/7/15 4:32:47 阅读更多 →

最新新闻

C++ STL算法完全指南:从迭代器到现代C++实战应用

C++ STL算法完全指南:从迭代器到现代C++实战应用

1. 项目概述:为什么我们需要一个C算法学习库?如果你正在学习C,或者已经是一名C开发者,那么“算法”这个词对你来说一定不陌生。无论是面试时被问到的“手写一个快排”,还是实际项目中需要处理数据排序、查找、去重&…

2026/7/15 5:27:12 阅读更多 →
彻底解决Delphi/C++Builder程序缺少VCL60.bpl运行时错误

彻底解决Delphi/C++Builder程序缺少VCL60.bpl运行时错误

1. 项目概述:直面一个经典的运行时“幽灵”如果你是一位使用Delphi或CBuilder 6(以及相近版本)进行开发的程序员,那么“VCL60.bpl”这个文件名,很可能是一个让你心头一紧的“老朋友”。这个看似普通的文件,…

2026/7/15 5:27:12 阅读更多 →
现代C++特性深度解析:从核心原理到工程实践

现代C++特性深度解析:从核心原理到工程实践

1. 项目概述:为什么我们需要“现代C”?如果你和我一样,是从C98甚至更早的版本一路写过来的,那么对“现代C”这个词一定感触颇深。它不是一个营销术语,而是对C11及之后版本一系列革命性变化的统称。在C98时代&#xff0…

2026/7/15 5:25:12 阅读更多 →
嵌入式C/C++中const关键字的深度解析与实战应用

嵌入式C/C++中const关键字的深度解析与实战应用

1. 项目概述:为什么const是嵌入式C/C工程师的“必答题”?在嵌入式软件工程师的面试里,尤其是C/C方向的岗位,有一个问题出现的频率高到几乎可以称之为“面试官的开场白”或“技术能力的试金石”,那就是关于const关键字的…

2026/7/15 5:25:12 阅读更多 →
ET框架AI行为树调试可视化:从原理到实战构建实时监控面板

ET框架AI行为树调试可视化:从原理到实战构建实时监控面板

1. 项目概述:为什么我们需要AI行为调试可视化?在ET框架里折腾过AI行为树的朋友,大概都经历过这样的场景:你精心设计了一个怪物的巡逻、追击、攻击逻辑,配置了复杂的条件节点和序列,但一运行起来&#xff0c…

2026/7/15 5:25:12 阅读更多 →
STM32F103RCT6适配2.0寸ILI9225 TFT屏的SPI驱动工程(含Keil工程+接线说明+显示例程)

STM32F103RCT6适配2.0寸ILI9225 TFT屏的SPI驱动工程(含Keil工程+接线说明+显示例程)

本文还有配套的精品资源,点击获取 简介:直接可用的STM32F103RCT6驱动2.0寸SPI接口ILI9225液晶屏完整开发包,基于Keil MDK环境构建,已预配置SPI外设、屏幕初始化时序及基础显示功能。内含可一键编译的.uvproj工程文件、startup启…

2026/7/15 5:25:12 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻