当前位置: 首页 > 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。

相关文章:

  • 【Hive基础】01.数据模型、存储格式、排序方式
  • 内网映射有什么作用,如何实现内网的网络地址映射到公网连接?
  • 【图像处理基石】什么是色彩模式?
  • 倚光科技在二元衍射面加工技术上的革新:引领光学元件制造新方向​
  • 佰力博科技与您探讨铁电分析仪具有哪些测试功能
  • 游戏引擎学习第313天:回到 Z 层级的工作
  • 聊天室H5实时群聊聊天室全开源系统(源码下载)
  • Lines of Thought in Large Language Models
  • 【自然语言处理与大模型】大模型(LLM)基础知识⑤
  • NV211NV212美光科技颗粒NV219NV220
  • 3.python操作mysql数据库
  • 01 NLP的发展历程和挑战
  • 大语言模型 19 - MCP FastAPI-MCP 实现自己的MCP服务 快速接入API
  • Spring AI 系列之一个很棒的 Spring AI 功能——Advisors
  • 临床试验中的独立数据监查委员会
  • 动态规划-918.环形子数组的最大和-力扣(LeetCode)
  • 【bug排查记录】由Redission配置引发的Satoken血案
  • 树莓派超全系列教程文档--(47)如何使用内核补丁
  • leetcode 525. 连续数组
  • 如何给自研MCP加上安全验证
  • 怎么用自己主机做网站/app下载推广
  • 网站开发建设收费标准/打开百度搜索
  • 在拼多多上怎么开网店/seo平台优化
  • 网站asp.net安装/竞价推广平台有哪些
  • 重庆建设工程信息网查询成绩分数/搜索引擎的优化和推广
  • 随州网站建设价格/百度seo搜索