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

leetcode 3559. Number of Ways to Assign Edge Weights II

  • leetcode 3559. Number of Ways to Assign Edge Weights II
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3559. Number of Ways to Assign Edge Weights II

1. 解题思路

这一题是题目3558. Number of Ways to Assign Edge Weights I的进阶版本。

对于题目3558来说,其核心就是找出树的最大深度,然后就是一个数学题了,要使得这一条路径上的边的总和为奇数,那么其可选的方式为:
N = ∑ i = 1 i ≤ n , i = 1 , 3 , 5 , ⋯ C n i = 2 n − 1 N = \sum\limits_{i=1}^{i \leq n, i=1,3,5,\cdots} C_{n}^{i} = 2^{n-1} N=i=1in,i=1,3,5,Cni=2n1

因此,我们可以直接计算出其结果。

而对于本题,问题增加的难度在于需要快速地任意给到的两个点 u , v u,v u,v,找出这两点间的连接线段的长度,而这个的话事实上和题目3553. Minimum Weighted Subgraph With the Required Paths II非常相近,事实上我们只需要分别求出这两个点 u , v u,v u,v的深度以及他们的最小公共父节点 p p p的深度,那么 u , v u,v u,v间的距离 d d d就可以快速通过下述公式计算得到:
d = h u + h v − 2 × h p d = h_u + h_v - 2\times h_p d=hu+hv2×hp

剩下的就是如何求出 u , v u,v u,v的最小公共父节点了,而这个事实上就是一个经典算法了,这里就不具体展开了,后续有时间的话可能会系统整理一下这个算法然后发一篇博客作为备忘好了。

2. 代码实现

给出python代码实现如下:

MOD = 10**9+7class 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 assignEdgeWeights(self, edges: List[List[int]], queries: List[List[int]]) -> List[int]:graph = defaultdict(list)for u, v in edges:graph[u].append(v)graph[v].append(u)depth = defaultdict(int)tree = defaultdict(list)def dfs(u, p):nonlocal depth, treeif u == 1:depth[u] = 0else:depth[u] = depth[p] + 1for v in graph[u]:if v == p:continuetree[u].append(v)dfs(v, u)returndfs(1, 0)lca = LCA(1, tree)def query(u, v):p = lca.query(u, v)d = depth[u] + depth[v] - 2*depth[p]return pow(2, d-1, MOD) if d > 0 else 0return [query(u, v) for u, v in queries]

提交代码评测得到:耗时2773ms,占用内存137.3MB。

http://www.xdnf.cn/news/656569.html

相关文章:

  • Leetcode 3557. Find Maximum Number of Non Intersecting Substrings
  • OpenGL: Transform知识
  • 8.1.2 商品信息动态网站 - JSP+Servlet实现动态网站
  • 基于DDD的企业团餐订餐平台微服务架构设计与实现
  • 使用 Cannonballs 进行实用导体粗糙度建模
  • IP动态伪装开关
  • C#实现SSE通信方式的MCP Server
  • 十三: 神经网络的学习
  • 集星云推短视频矩阵系统的定制化与私有化部署方案
  • 将YOLO格式的数据集转换为mmdetection格式
  • 【密码学——基础理论与应用】李子臣编著 第十三章 数字签名 课后习题
  • 数据保护在Web3应用中的重要性及其实现
  • vue+ThreeJs 创建过渡圆圈效果
  • 行为型:状态模式
  • SmartSoftHelp 图片资源技术保护可执行添加水印方案---深度优化版:SmartSoftHelp DeepCore XSuite
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)
  • 第二十章:数据治理之数据指标(二):数据指标和数据指标体系
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(29):ので
  • “轩辕杯“云盾砺剑CTF挑战赛 Web wp
  • 限流系列:sentinel
  • 哈希表基础知识
  • 选择SEO公司时需要注意哪些关键指标?
  • 多模态大语言模型arxiv论文略读(九十二)
  • 2025.05.26【Wordcloud】词云图绘制技巧
  • pkg-config的功能与作用说明
  • jeecg-boot vue点击左侧菜单跳转无菜单栏的全屏页面
  • PostgreSQL日志管理完整方案(AI)
  • 学习心得(14--16)
  • 使用 Vuex 实现用户注册与登录功能
  • HTML流星雨