LeetCode:2867. 统计树中的合法路径数目(筛质数+ DFS Java)

目录

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

题目描述:

实现代码与思路:

筛质数 + DFS 

原理思路:


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 <= 105
  • edges.length == n - 1
  • edges[i].length == 2
  • 1 <= ui, vi <= n
  • 输入保证 edges 形成一棵合法的树。

实现代码与思路:

筛质数 + DFS 

class Solution {private final static int N = (int)1e5 + 10;// 构建图,邻接表int[] h = new int[N], e = new int[N * 2], ne = new int[N * 2];int idx;boolean[] np = new boolean[N + 1]; // 筛选质数// 筛选1 ~ n 之中的质数public void getPrimes() {np[1] = true;for (int i = 2; i * i <= N; i++) {if (!np[i]) { // 若是质数,向后利用其筛选for (int j = i * i; j <= N; j += i) {np[j] = true; // 被筛掉}}}} // 连接边public void add(int a, int b) {e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}public long countPaths(int n, int[][] edges) {getPrimes();Arrays.fill(h, -1);// 加边for (int i = 0; i < edges.length; i++) {int a = edges[i][0];int b = edges[i][1];add(a, b);add(b, a);}long res = 0;int[] st2 = new int[n + 1]; // 记忆化搜索,判断是否已经计算过以此节点为头的子树中非质数的个数for (int cur = 1; cur <= n; cur++) {if (np[cur]) continue; // 起始头不遍历非质数System.out.println(cur);int sum = 0; // 以当前节点为头,各个子树中非质数的节点和for (int i = h[cur]; i != -1; i = ne[i]) {int j = e[i];if (!np[j]) continue; // 不遍历质数if (st2[j] == 0) { // 以非指数节点开头,记忆化搜索,记录下来个数List<Integer> nodes = new ArrayList<Integer>();dfs(j, -1, nodes);for (int t: nodes) {st2[t] = nodes.size();}}res += (long) st2[j] * sum; // 和以及遍历计算出的结点和相乘,计算非质数与非质数,经过一个质数的路径sum += st2[j];}res += sum; // 加上头节点开始的路径}return res;}// dfspublic void dfs(int x, int fa, List<Integer> nodes) {nodes.add(x);for (int i = h[x]; i != -1; i = ne[i]) {int j = e[i];if (j != fa && np[j]) {dfs(j, x, nodes);}}}
}

原理思路:

        筛选出质数,建图,以质数开始向外遍历一次,找到其非质数的子树,dfs计算每个子树的非质数个数,通过计算算出此质数相连的所有路径。最终算出全部符合条件的路径个数。详见代码。

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

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

相关文章

西软云XMS operate XXE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

linux使用scp命令来在两台Linux设备之间传输文件

1、linux怎么将一个文件发送到另一个linux设备特定目录下 可以使用scp命令&#xff08;secure copy&#xff09;来将文件从一个Linux设备复制到另一个Linux设备的特定目录下。假设你要将本地文件localfile.txt发送到远程设备的/remote/directory目录下&#xff0c;你可以使用以…

Oracle修改用户密码之后连接特别慢的问题

一、问题现象 oracle数据库密码修改后连接速度特别慢&#xff0c;甚至出现超时的问题&#xff0c;查询表也特别慢 更改密码后&#xff0c;每次连接异常慢&#xff0c;就算用正确的密码连接&#xff0c;验证延时也非常大&#xff0c;导致应用程序连接反复出现超时现象&#xf…

Jquery操作DOM对象

文章目录 目录 文章目录 本章目标 一.DOM操作分类 二.JQuery中的DOM操作 内容操作 属性值操作 节点操作 节点属性操作 节点遍历 总结 本章目标 使用Jquery操作网页元素使用JQuery操作文本与属性值内容使用JQuery操作DOM节点使用Jquery遍历DOM节点使用JQuery操作CSS-DOM 一…

Groovy(第八节) Groovy 之类

目录 Song 类 Groovy 类就是 Java 类 类的关系 类初始化 核心的灵活性

WebServer -- 日志系统(下)

目录 &#x1f33c;整体思路 &#x1f382;基础API fputs 可变参数宏 __VA_ARGS__ fflush &#x1f6a9;流程图与日志类定义 流程图 日志类定义 &#x1f33c;功能实现 生成日志文件 && 判断写入方式 日志分级与分文件 &#x1f33c;整体思路 日志系统分两部…

常见概率分布介绍

介绍 概率分布是统计学中用于描述随机变量的概率特征的函数。以下是几种常用的概率分布&#xff1a; 均匀分布&#xff08;Uniform Distribution&#xff09;: 离散均匀分布: 每个结果发生的概率相等。连续均匀分布: 任意两个相同长度的区间内取值的概率相同。 二项分布&am…

无法调试MFC源码

VS无法调试MFC源码 起初 有时候就是这么无奈&#xff0c;MFC源码各种问题没有办法调试&#xff0c;可是又想看下代码如何调用&#xff0c;里面做了些什么&#xff0c;从哪儿调出&#xff0c;学习一下大神的思路什么的。整理一下有可能的原因。 检查生成代码设置 需要设置正…

[Java 基础] Java修饰符

Java修饰符详解 Java修饰符用于定义类、方法或者变量&#xff0c;修改其行为的关键字。Java语言主要提供了两类修饰符&#xff1a; 访问权限修饰符: default, public , protected, private非访问权限修饰符: final, abstract, static, synchronized&#xff0c; volatile等 …

04 Opencv图像操作

文章目录 读写像素修改像素值Vec3b与Vec3F灰度图像增强获取图像通道bitwise_not 算子对图像非操作 读写像素 读一个GRAY像素点的像素值&#xff08;CV_8UC1&#xff09; Scalar intensity img.at(y, x); 或者 Scalar intensity img.at(Point(x, y)); 读一个RGB像素点的像素值…

js【详解】数据类型原理(含变量赋值详解-浅拷贝)

JavaScript 中的数据按存储方式的不同&#xff0c;分为值类型和引用类型。 值类型&#xff08;共 6 种&#xff09;&#xff1a;赋值的时候传值 —— 数字、字符串、布尔值、null 、undefined&#xff0c;Symbol引用类型&#xff08;仅 1 种&#xff09;&#xff1a;赋值的时候…

虚拟机看不到共享文件夹

johnjohn-virtual-machine:/mnt/hgfs$ cat /etc/issue Ubuntu 20.04.6 LTS \n \l 看下是否挂载 johnjohn-virtual-machine:/mnt/hgfs$ vmware-hgfsclient FPGAs_AdaptiveSoCs_Unified_2023.2_1013_2256 xilinx 取消挂载 johnjohn-virtual-machine:/mnt/hgfs$ sudo umount /mn…

kvm虚拟机修改网络模式

kvm修改网络模式可以直接使用virsh命令进行修改 一、查看主机 virsh list --all 二、查看需要修改主机的网络模式 virsh domiflist mysql 三、vim进行修改 cd /etc/libvirt/qemu/ vim mysql.xml 四、找到要修改的网卡部分 五、重新定义虚拟机 virsh define mysql_install.xml…

java工具类之解析地址

输出 代码实现 import java.util.regex.Matcher; import java.util.regex.Pattern;public class AddressResolutionUtil {/*** 解析地址* author ys* param address* return*/public static String addressResolution(String address){String regex"(?<province>…

Java的编程之旅32——继承与多态的联合使用

模拟USB设备接入电脑 1.首先建立一个名为“USB”的抽象类 public abstract class USB {public abstract void On();public abstract void Off(); }这是一个抽象类USB&#xff0c;表示一个USB设备。 该类有两个抽象方法On()和Off()&#xff0c;分别表示打开和关闭USB设备。 由…

javaee教程郑阿奇,一线互联网架构师筑基必备技能之Java篇

一、什么情况下会发生栈内存溢出&#xff1f; 1、栈是线程私有的&#xff0c;栈的生命周期和线程一样&#xff0c;每个方法在执行的时候就会创建一个栈帧&#xff0c;它包含局部变量表、操作数栈、动态链接、方法出口等信息&#xff0c;局部变量表又包括基本数据类型和对象的引…

【GameFramework框架内置模块】6、实体(Entity)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

K 个一组翻转链表 力扣

【玩转校招算法面试】第三天&#xff1a;链表中的节点每k个一组翻转&#xff08;动画演示、手写 Java 代码、详细注释、LeetCode 高频算法题&#xff09;_哔哩哔哩_bilibili 初始状态&#xff1a;1 -> 2 -> 3&#xff0c;pre null, cur 1保存当前节点的下一个节点&…

并查集基础,死去的回忆突然攻击我

并查集普及【模板】并查集 - 洛谷 #include<iostream> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; #define int long long typedef pair<int,int> PII; #define xx first #define y…

TypeScript 中类的理解及应用场景

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端各领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端…