DeepSeek    LeetCode 3559. 给边赋权值的方案数 II Python3实现
根据题目要求对于树中任意两个节点 u 和 v路径长度为 d边数使路径总代价为奇数的赋值方案数为 2^(d-1)。因此核心是快速求树上两点距离。Python3 实现pythonclass Solution:MOD 10**9 7def assignEdgeWeights(self, edges: List[List[int]], queries: List[List[int]]) - List[int]:n len(edges) 1# 1. 建图无向树graph [[] for _ in range(n)]for u, v in edges:u - 1v - 1graph[u].append(v)graph[v].append(u)# 2. 预处理深度和倍增表LOG (n).bit_length() # ceil(log2(n)) 1depth [0] * nup [[0] * LOG for _ in range(n)]# DFS 构建倍增表stack [(0, -1)] # (node, parent)order [] # 后序遍历顺序parent [-1] * nwhile stack:node, par stack.pop()parent[node] parorder.append(node)for nei in graph[node]:if nei ! par:depth[nei] depth[node] 1stack.append((nei, node))# 初始化 up[0]for i in range(n):up[i][0] parent[i] if parent[i] ! -1 else i# 构建倍增表for j in range(1, LOG):for i in range(n):up[i][j] up[up[i][j-1]][j-1]# 3. 预处理 2 的幂次pow2 [1] * (n 1)for i in range(1, n 1):pow2[i] (pow2[i-1] * 2) % self.MOD# 4. 处理每个查询ans []for u, v in queries:u - 1v - 1lca self._find_lca(u, v, depth, up, LOG)dist depth[u] depth[v] - 2 * depth[lca]ans.append(0 if dist 0 else pow2[dist - 1])return ansdef _find_lca(self, u, v, depth, up, LOG):求 LCA# 确保 u 是较浅的节点if depth[u] depth[v]:u, v v, u# 将 v 提升到与 u 同深度diff depth[v] - depth[u]for j in range(LOG):if (diff j) 1:v up[v][j]if u v:return u# 同时提升for j in range(LOG - 1, -1, -1):if up[u][j] ! up[v][j]:u up[u][j]v up[v][j]return up[u][0]优化版本使用 BFS 替代 DFSpythonfrom collections import dequeclass Solution:MOD 10**9 7def assignEdgeWeights(self, edges: List[List[int]], queries: List[List[int]]) - List[int]:n len(edges) 1# 建图graph [[] for _ in range(n)]for u, v in edges:u, v u - 1, v - 1graph[u].append(v)graph[v].append(u)# BFS 预处理深度和父节点LOG (n).bit_length()depth [0] * nup [[0] * LOG for _ in range(n)]q deque([0])visited [False] * nvisited[0] Trueparent [-1] * nwhile q:node q.popleft()for nei in graph[node]:if not visited[nei]:visited[nei] Truedepth[nei] depth[node] 1parent[nei] nodeq.append(nei)# 初始化倍增表for i in range(n):up[i][0] parent[i] if parent[i] ! -1 else ifor j in range(1, LOG):for i in range(n):up[i][j] up[up[i][j-1]][j-1]# 预处理 2 的幂pow2 [1] * (n 1)for i in range(1, n 1):pow2[i] (pow2[i-1] * 2) % self.MOD# 处理查询def lca(u, v):if depth[u] depth[v]:u, v v, u# 提升 vdiff depth[v] - depth[u]j 0while diff:if diff 1:v up[v][j]diff 1j 1if u v:return ufor j in range(LOG - 1, -1, -1):if up[u][j] ! up[v][j]:u up[u][j]v up[v][j]return up[u][0]ans []for u, v in queries:u, v u - 1, v - 1ancestor lca(u, v)dist depth[u] depth[v] - 2 * depth[ancestor]ans.append(0 if dist 0 else pow2[dist - 1])return ans更简洁的实现使用递归 DFSpythonclass Solution:MOD 10**9 7def assignEdgeWeights(self, edges: List[List[int]], queries: List[List[int]]) - List[int]:n len(edges) 1# 建图g [[] for _ in range(n)]for u, v in edges:u, v u - 1, v - 1g[u].append(v)g[v].append(u)# DFS 预处理LOG n.bit_length()depth [0] * nup [[0] * LOG for _ in range(n)]def dfs(node, parent):up[node][0] parent if parent ! -1 else nodefor j in range(1, LOG):up[node][j] up[up[node][j-1]][j-1]for nei in g[node]:if nei ! parent:depth[nei] depth[node] 1dfs(nei, node)dfs(0, -1)# LCA 函数def get_lca(u, v):if depth[u] depth[v]:u, v v, u# 提升 vdiff depth[v] - depth[u]j 0while diff:if diff 1:v up[v][j]diff 1j 1if u v:return ufor j in range(LOG - 1, -1, -1):if up[u][j] ! up[v][j]:u up[u][j]v up[v][j]return up[u][0]# 预处理 2 的幂pow2 [1] * (n 1)for i in range(1, n 1):pow2[i] (pow2[i-1] * 2) % self.MOD# 处理查询return [0 if dist 0 else pow2[dist - 1]for u, v in queriesfor dist in [depth[u-1] depth[v-1] - 2 * depth[get_lca(u-1, v-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 为查询数。核心公式证明对于路径长度为 d 的路径每条边可选权重 1 或 2路径总代价为奇数等价于· 路径上有奇数条边权重为 1其余为 2· 从 d 条边中选择奇数条赋值为 1 的方案数组合数公式C(d,1) C(d,3) C(d,5) ... 2^(d-1)因此答案为 2^(d-1)。当 d 0 时即 u v方案数为 0。

相关新闻

高速ADC核心性能与JESD204B接口设计实战解析

高速ADC核心性能与JESD204B接口设计实战解析

1. 项目概述:为什么我们需要ADC31JB68这样的高速ADC?在无线通信、雷达探测或者高端测试仪器里,我们工程师常常面临一个核心挑战:如何把现实世界中瞬息万变、频率极高的模拟信号,一丝不苟地“搬进”数字世界进行处理&am…

2026/7/15 20:51:11 阅读更多 →
Python 客户端开发竟藏如此多门道,速来一探究竟

Python 客户端开发竟藏如此多门道,速来一探究竟

开发(19): 网络编程基础, 构建简单的客户端与服务器, 目录, 1. 引言, 讲的是什么是网络编程?所谓网络编程, 指的是借助网络协议达成计算机或者应用程序相互之间的数据交换以及通信。在我们平常的生活里, 所运用的各类服务都和网络编程脱不了干系。比如说…

2026/7/15 20:51:11 阅读更多 →
零基础学 Python 第9章 | 函数基础:def、参数与返回值

零基础学 Python 第9章 | 函数基础:def、参数与返回值

本章摘要 核心目标:学会用 def 定义函数,把代码打包成可复用的工具核心知识点:def 定义函数、形参与实参、return 返回值、多返回值、函数调用流程、参数默认值实操产出:封装温度转换、BMI计算、密码强度检测三个实用函数工具集前…

2026/7/15 20:49:10 阅读更多 →

最新新闻

物理AI数据基建风起,分布式光纤传感龙头光格科技站上产业“卖水人”风口

物理AI数据基建风起,分布式光纤传感龙头光格科技站上产业“卖水人”风口

当市场还在热议人形机器人本体谁能率先量产时,资本的目光已悄然上移——谁在为物理AI的“大脑”提供感知世界的“神经末梢”?近期,A股机器人概念板块经历剧烈震荡,但物理AI数据基建赛道的长期逻辑反而在波动中愈发清晰。据证券时报…

2026/7/15 21:59:53 阅读更多 →
数字IC后端实战:基于Innovus的电源规划与布线拥塞分析

数字IC后端实战:基于Innovus的电源规划与布线拥塞分析

1. 电源规划:构建稳健的电力高速公路在数字IC后端设计中,电源规划就像给城市建造供电系统。如果电力供应不稳定,再精妙的电路设计也无法正常工作。Innovus提供了完整的电源网络规划工具链,我常用的是从电源环(Ring&…

2026/7/15 21:59:53 阅读更多 →
AI大模型就业:用业务闭环验证方案

AI大模型就业:用业务闭环验证方案

聊《别急着重做AI大模型就业,先看岗位到底在筛什么》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&#…

2026/7/15 21:59:53 阅读更多 →
LLM 调用链可视化:一次 Agent 调用到底走了几步

LLM 调用链可视化:一次 Agent 调用到底走了几步

LLM 调用链可视化:一次 Agent 调用到底走了几步 一、背景与问题 LLM Agent 的调用链路比单次推理复杂得多。一个典型的 Agent 请求不是"用户提问→模型回答",而是"用户提问→意图识别→工具选择→工具调用→结果整合→二次推理→最终回答…

2026/7/15 21:57:42 阅读更多 →
【数据挖掘实战】从购物篮到推荐系统:Apriori与FP-Growth算法Python全解析

【数据挖掘实战】从购物篮到推荐系统:Apriori与FP-Growth算法Python全解析

1. 从"啤酒与尿布"说起:频繁模式挖掘的商业价值 1990年代,沃尔玛的工程师在分析销售数据时发现一个有趣现象:啤酒和尿布经常出现在同一张购物小票上。经过调查发现,年轻父亲们常在购买婴儿用品时顺手带走几罐啤酒。这个…

2026/7/15 21:53:34 阅读更多 →
让角色“活“起来的大脑:深入理解 Animator 状态机

让角色“活“起来的大脑:深入理解 Animator 状态机

引子:一具"僵硬"的木偶 想象一下,你刚刚做好了一个游戏角色。 他有精致的模型(Mesh)、逼真的皮肤贴图(Texture)、在灯光下泛着恰到好处的光泽。从外表看,他堪称完美——一个英姿飒爽的…

2026/7/15 21:51:34 阅读更多 →

日新闻

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/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

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

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

2026/7/15 19:42:20 阅读更多 →
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/15 17:52:08 阅读更多 →

月新闻