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

news2024/11/20 6:24:01

目录

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;
    }
    // dfs
    public 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.coloradmin.cn/o/1478440.html

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

相关文章

精读《React 高阶组件》

本期精读文章是&#xff1a;React Higher Order Components in depth 1 引言 高阶组件&#xff08; higher-order component &#xff0c;HOC &#xff09;是 React 中复用组件逻辑的一种进阶技巧。它本身并不是 React 的 API&#xff0c;而是一种 React 组件的设计理念&…

java演唱会网上订票购票系统springboot+vue

随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的交换和信息流通显得特别重要。因此&#xff0c;开发合适的基于springboot的演唱会购票系统的设计与实现成为企业必然要走…

安科瑞Acrel-2000ES 储能柜能量管理系统

安科瑞戴婷 安科瑞储能能量管理系统Acrel-2000ES&#xff0c;专门针对工商业储能柜、储能集装箱研发的一款储能EMS&#xff0c; 具有完善的储能监控与管理功能,涵盖了储能系统设备(PCS、BMS、电表、消防、空调等)的详细信息,实现了数据采集、数据处理、数据存储、数据查询与分…

17.题目:编号3766 无尽的石头

题目&#xff1a; ###本题主要考察模拟 #include<bits/stdc.h> using namespace std; int sum(int x){int result0;while(x){resultx%10;x/10;}return result; } int main(){int t;cin>>t;while(t--){int n;cin>>n;int buf1;int ans0;for(int i1;i<100…

内核打印应用程序出错信息,DEBUG_USER

前言 在 Linux 系统中&#xff0c;运行一个应用程序&#xff0c;突然提示段错误&#xff0c;并停止运行 # ./crash.out Segmentation fault如果这个时候操作系统能多提示点错误信息&#xff0c;那将会缩短我们 debug 的时间。 core dump 就是一个办法&#xff0c;可以查看我…

网络工程师笔记2

TCP-----FTP&#xff0c;可靠连接&#xff0c;三次握手&#xff0c;四次挥手 UDP-----TFTP&#xff0c;两次握手&#xff0c;不可靠连接 应用层 传输层 网络层 网络接口层 源/目数据校验 数据帧&#xff1a; header date trailer…

每天十条linux知识点-24-0226(1)

文章目录 1.在哪下载linux内核源码&#xff1f;2.linux文件夹都有哪些文件&#xff1f;arch&#xff1a;包含和硬件体系结构相关的代码&#xff0c;每种平台占一个相应的目录&#xff0c;如i386、arm、arm64、powerpc、mips等。block&#xff1a;块设备驱动程序I/O调度。certs&…

企业文件图纸加密有哪些?图纸文件加密防泄密软件如何选?

在现在的市场发展中&#xff0c;对于企业的图纸文件安全问题越来越重视&#xff0c;如设计图纸&#xff0c;重要文件等&#xff0c;一旦泄漏就会给企业造成巨大的经济损失。所以对企业管理者来讲&#xff0c;如何才能选择一款好用的适合本企业的图纸文件加密软件是非常重要的&a…

【转载】Windows 11 任务栏位置调整

更改注册表&#xff08;部分win11版本有效&#xff09; Win R快捷键打开「运行」——执行regedit命令打开「注册表编辑器」进入路径&#xff1a; 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3 修改Settings这个二进制的第 2 行…

一台工控机的能量

使用Docker搭建EPICS的IOC记录 Zstack EPICS Archiver在小课题组的使用经验 以前电子枪调试&#xff0c;用一台工控机跑起束测后台&#xff0c;这次新光源用的电子枪加工回来又是测试&#xff0c;又是用一台工控机做起重复的事&#xff0c;不过生命在于折腾&#xff0c;重复的…

VR文化旅游虚拟现实介绍|虚拟现实产品销售

VR文化旅游虚拟现实&#xff08;Virtual Reality Cultural Tourism&#xff09;是指利用虚拟现实技术来提供沉浸式的文化旅游体验&#xff0c;使用户可以通过虚拟现实设备&#xff0c;如头戴式显示器或VR眼镜等&#xff0c;在虚拟空间中探索和体验不同地域、历史和文化的景点和…

一个Bug搞懂浏览器缓存策略

最近项目遇到一个问题&#xff0c;发版之后&#xff0c;用户需要清除缓存才可以访问到最新的应用&#xff0c;但是我们访问却可以正常。经过1天的研究搞懂了浏览器缓存的机制&#xff0c;记录下分析轨迹。 浏览器缓存基础知识 浏览器强缓存和协议缓存都是用来提高网页加载速度…

Python中简单正则获取百度新闻页面所有超链接示例

一、示例代码&#xff1a; import re import requestsheaders {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/""85.0.4183.83 Safari/537.36"} resp requests.get(http://news.…

135.乐理基础-半音是小二度吗?全音是大二度吗?三全音

内存参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;134.乐理基础-音程名字的简写-CSDN博客 上一个内容里练习的答案&#xff1a; 半音可以与小二度划等号吗&#xff1f;全音可以和大二度划等号吗&#xff1f; 严格来说它们是不能划等号的&#xff0c;半音与全音是侧…

1.1 编程环境的安装

汇编语言 汇编语言环境部署 第二个运行程序直接双击安装一直下一步即可MASM文件复制到D盘路径下找到dosbox安装路径&#xff1a;C:\Program Files (x86)\DOSBox-0.74找到该文件双击打开它&#xff0c;修改一下窗口大小 把这两行改成如下所示 运行dos&#xff0c;黑框中输入mou…

【GB28181】wvp-GB28181-pro快速修改登录页面名称(前端)

引言 作为一个非前端开发人员,自己摸索起来比较费劲,也浪费了很多时间 本文快速帮助开发者修改为自己名称的一个国标平台 文章目录 一、 预期效果展示二、 源码修改-前端三、 验证修改效果一、 预期效果展示 二、 源码修改-前端 需要修改的文件位置: 项目工程下web_src目录…

复现nerfstudio并训练自己制作的数据集

网站&#xff1a;安装 - nerfstudio GitHub - nerfstudio-project/nerfstudio&#xff1a;NeRF 的协作友好工作室 安装之前要确保电脑上已经有CUDA11.8或以上版本&#xff08;更高版本的可以安装11.8的toolkit&#xff09; 创建环境 conda create --name nerfstudio -y pyt…

如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备&#xff0c;尽管最初并非设计为服务器&#xff0c;但是随着技术的进步我们可以将Android配置为生产力工具&#xff0c;变成一个随身…

基于视觉识别的自动采摘机器人设计与实现

一、前言 1.1 项目介绍 【1】项目功能介绍 随着科技的进步和农业现代化的发展&#xff0c;农业生产效率与质量的提升成为重要的研究对象。其中&#xff0c;果蔬采摘环节在很大程度上影响着整个产业链的效益。传统的手工采摘方式不仅劳动强度大、效率低下&#xff0c;而且在劳…

AI智能电销机器人效果怎么样?呼叫部署

我们的生活早已变得无处不智能&#xff0c;从智能手机到无人车、虚拟VR到智能家居&#xff0c;你迎接的每一个清晨、享受的每一个夜晚&#xff0c;可能都离不开智能设备的服务。 工作中&#xff0c;智能化产业也正在影响着企业&#xff0c;电销机器人正在帮助各大企业获得更高的…