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

news/2024/7/20 21:57:48 标签: leetcode, 深度优先, 算法

目录

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.niftyadmin.cn/n/5398529.html

相关文章

租赁小程序|租赁系统|租赁软件开发带来高效运营

随着社会的不断发展和科技的不断进步&#xff0c;越来越多的企业开始关注设备租赁业务。设备租赁作为一种短期使用设备的方式&#xff0c;为企业提供了灵活和成本节约的优势。针对设备租赁业务的管理和提升企业竞争力的需求&#xff0c;很多企业选择定制开发设备租赁系统。本文…

Makefile中如何使用echo输出$符号

赶在月底发一篇&#xff0c;因为大佬讲了&#xff0c;普通人要想有所作为&#xff08;咱不说是逆袭&#xff0c;因为这个标题立的有点大了&#xff09;&#xff0c;就得持续输出&#xff0c;因为不是说你学习了就成为自己的了&#xff0c;是否内化于心&#xff0c;也就是消化吸…

混合云搭建-S2S VPN 连接Azure和AWS云动手实践

随着云计算的普及,越来多的企业选择将其业务部署在云环境中。混合云,作为一种将公有云与私有云结合使用的模式,为企业提供了灵活性和扩展性。在这种背景下,搭建一个安全可靠的S2S VPN连接,实现不同云服务商之间的互联互通,成为了企业云策略的一个重要组成部分。这里介绍通…

李沐动手学习深度学习——3.2练习

以下是个人理解&#xff0c;希望进行讨论求解。 练习 1. 如果我们将权重初始化为零&#xff0c;会发生什么。算法仍然有效吗&#xff1f; 根据SGD算法公式如上&#xff0c;第一次迭代的值可知w只与b相关&#xff0c;而对于b的迭代更新&#xff0c;只是与b的初始值相关&#x…

请求响应与统一响应结果

1.请求响应 1.安装postman 2.简单的参数 //原始的请求参数的方法RequestMapping("/simoleParam")public String simpleParam(HttpServletRequest request){String name request.getParameter("name");String ageStr request.getParameter("age&quo…

如何下载和配置Linux(使用VMware部署Centos)--看这篇文章就懂了

目录: LinuxLinux概述Linux特点Linux的各个发行版本Linux和Windows区别 Linux的下载和安装安装VMWare虚拟机和Centos安装Centos实现Linux的远程登录使用Xshell连接 Linux Linux概述 Linux内核最初只是由芬兰人林纳斯托瓦兹1991年在赫尔辛基大学上学时出于个人爱好而编写的。 …

Kernel[Device Tree] - 1. 设备树的由来

内核代码中&#xff0c;arch文件夹下&#xff0c;是各个架构相关的代码&#xff0c;arm也在里面。 arm子文件夹下&#xff0c;有mach-xxx的目录&#xff0c;就是针对各个芯片类型的&#xff0c;比如mach-imx就是imx系列的芯片。 再里面就是具体的芯片或SOC&#xff0c;比如ma…

一图总结:华为销售体系(铁三角组织LTC流程)

《华为铁三角工作法》阅读了多遍&#xff0c;花了些时间整理了一张图对本书的框架性总结&#xff0c;从流程&#xff08;LTC&#xff09;、组织&#xff08;铁三角&#xff09;、激励和管理三个大方面概览华为销售体系。 核心是一靠流程&#xff0c;二靠团队&#xff0c;而前提…