每日一题 2867统计树中的合法路径

2867. 统计树中的合法路径数目

题目描述:

给你一棵 n 个节点的无向树,节点编号为 1 到 n 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示节点 ui 和 vi 在树中有一条边。

请你返回树中的 合法路径数目 。

如果在节点 a 到节点 b 之间 恰好有一个 节点的编号是质数,那么我们称路径 (a, b) 是 合法的 。

注意:

  • 路径 (a, b) 指的是一条从节点 a 开始到节点 b 结束的一个节点序列,序列中的节点 互不相同 ,且相邻节点之间在树上有一条边。
  • 路径 (a, b) 和路径 (b, a) 视为 同一条 路径,且只计入答案 一次 。

示例 1:

输入:n = 5, edges = [[1,2],[1,3],[2,4],[2,5]]
输出:4
解释:恰好有一个质数编号的节点路径有:
- (1, 2) 因为路径 1 到 2 只包含一个质数 2 。
- (1, 3) 因为路径 1 到 3 只包含一个质数 3 。
- (1, 4) 因为路径 1 到 4 只包含一个质数 2 。
- (2, 4) 因为路径 2 到 4 只包含一个质数 2 。
只有 4 条合法路径。

示例 2:

输入:n = 6, edges = [[1,2],[1,3],[2,4],[3,5],[3,6]]
输出:6
解释:恰好有一个质数编号的节点路径有:
- (1, 2) 因为路径 1 到 2 只包含一个质数 2 。
- (1, 3) 因为路径 1 到 3 只包含一个质数 3 。
- (1, 4) 因为路径 1 到 4 只包含一个质数 2 。
- (1, 6) 因为路径 1 到 6 只包含一个质数 3 。
- (2, 4) 因为路径 2 到 4 只包含一个质数 2 。
- (3, 6) 因为路径 3 到 6 只包含一个质数 3 。
只有 6 条合法路径。

提示:

  • 1 <= n <= 10^5
  • edges.length == n - 1
  • edges[i].length == 2
  • 1 <= ui, vi <= n
  • 输入保证 edges 形成一棵合法的树。

思路:

1)虽然他是想构成一棵树,但个人觉得更像缩减版的图,不过最后一句提示“输入保证 edges 形成一棵合法的树。”保证了树的存在。但其实质相同,就是对图的每一个节点,深度遍历,然后统计“合法”的路径数量

2)枚举每个质数节点,从质数的邻居开始dfs,统计在不经过质数的前提下能访问到多少个非质数。以下图为例,假设2的邻居能访问到3,4,5个非质数。

4和左边这3个点,两两之间的路径都只包含质数2。5和左边这3+4个点,两两之间的路径都只包含质数2.根据乘法原理,把4*3+5*7加到答案中。注:只考虑左边是避免重复统计。最后,从2出发到下面这3+4+5=12个点的路径也只包含质数2把12加到答案中。

代码:

#标记10^5以内质数
MX=10**5+1
isPrime=[True]*MX
isPrime[1]=False
for i in range(2,isqrt(MX)+1):if isPrime[i]:for j in range(i*i,MX,i):#j为i的倍数,代表非质数isPrime[j]=Falseclass Solution:def countPaths(self, n: int, edges: List[List[int]]) -> int:#构建邻接表g=[[] for _ in range(n+1)]for x,y in edges:g[x].append(y)g[y].append(x)def dfs(x:int,fa:int)->None:nodes.append(x)for y in g[x]:if y !=fa and not isPrime[y]:dfs(y,x)ans = 0size = [0] * (n + 1)for x in range(1, n + 1):if not isPrime[x]:  # 跳过非质数continues=0for y in g[x]:  # 质数 x 把这棵树分成了若干个连通块if isPrime[y]:continueif size[y]==0:#还没计算的nodes=[]dfs(y,-1) # 遍历 y 所在连通块,在不经过质数的前提下,统计有多少个非质数for z in nodes:size[z]=len(nodes)# 这 size[y] 个非质数与之前遍历到的 s 个非质数,两两之间的路径只包含质数 xans+=size[y]*ss+=size[y]ans+=s  #从x出发的路径return ans

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/494282.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编曲学习:和声小调 终止式 离调和弦 转调应用

和声小调 音阶 大调音程关系排列:全 全 半 全 全 全 半 小调音程关系排列:全 半 全 全 半 全 全 C大调音阶: 1 2 3 4 5 6 7 1 C小调音阶: 1 2 b3 4 5 b6 b7 1 C大调基本音级构成的和弦: Cmaj7 Dmin7 Emin7 Fmaj7 G7 Amin7 Bm7-5 C小调基本音级构成的和弦: Cmin7 D…

python Matplotlib Tkinter-->tab切换1

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

键盘锁住了怎么解锁?这4个方法轻松帮你解决!

“我在使用电脑输入文字时不知道按错了什么键&#xff0c;导致键盘锁住了。有什么简单的方法可以帮助键盘快速解锁吗&#xff1f;” 当我们在使用电脑时&#xff0c;突然发现键盘被锁住&#xff0c;无法输入任何字符&#xff0c;这无疑会让人感到困扰。但请别担心&#xff0c;这…

无刷电机的2种电流采样方式以及优缺点比较

低端电流采样&#xff1a; 在低端采样方式中&#xff0c;电流检测电阻&#xff08;分流电阻&#xff09;通常被放置在逆变器下桥臂MOSFET或IGBT的低端&#xff0c;即靠近电机绕组的地线侧。这种情况下&#xff0c;只有当对应相位的下管导通时&#xff0c;才能通过这个电阻来测量…

雾锁王国Enshrouded多人联机专用服务器配置要求

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

Leetcode——hot3最长连续序列

最长连续序列 class Solution {public int longestConsecutive(int[] nums) {if(nums.length 0 || nums.length 1){return nums.length;}Arrays.sort(nums);int count 1;int max 1;for(int i 0; i < nums.length - 1; i){if(nums[i1] - nums[i] 1){count;if(count &…

【C++】---内存管理new和delete详解

一、C/C内存分布 C/C内存被分为6个区域&#xff1a; &#xff08;1&#xff09; 内核空间&#xff1a;存放内核代码和环境变量。 &#xff08;2&#xff09;栈区&#xff1a;向下增长&#xff08;存放非静态局部变量&#xff0c;函数参数&#xff0c;返回值等等&#xff09; …

理解npm run dev 和 npm run serve的区别

文章目录 1. 分析npm run2. dev与serve的区别 1. 分析npm run npm npm 是 Node.js 的包管理器&#xff0c;它允许你安装、更新、删除和管理 Node.js 的模块和应用程序。 run run 是 npm 的一个子命令&#xff0c;用于执行在 package.json 文件的 scripts 部分定义的脚本。 dev…

C#中字典Dictionary的实现原理

在 C# 中&#xff0c;字典的实现通常使用哈希表。Dictionary<TKey, TValue> 类就是 C# 中的哈希表实现之一。 哈希表的数据结构&#xff1a; Dictionary<TKey, TValue> 内部使用了哈希表的数据结构来存储键值对。哈希表通常是一个数组&#xff0c;每个数组元素通常…

导入arviz出现的错误

导入arviz时&#xff0c;很有可能出现 UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xba in position 2367: illegal multibyte sequence 这是因为我们的操作系统环境引起的。通过仔细阅读错误信息&#xff0c;可以定位出是pathlib.py中的read_text不传encoding参数…

OSI参考模型和TCP/IP网络参考模型

1、OSI参考模型 1.1 产生背景 为了解决网络之间的兼容性问题,实现网络设备间的相互通讯,国际标准化组织ISO于1984年提出了OSIRM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI参考模型很快成为计算机网络通信的基础模型。由于种种原因,并没有…