树是一张 n 个点 n-1 条边的无向联通图,每两个点都有唯一的一条简单路径。有根树是指以其中一个点为根节点的树,叶子节点是指除根节点外度数为 1 的节点。一个点的度数是指与其相连的点的个数。有根树上,一个点的深度是指其与根节点之间的简单路径的边数。 在某一棵以 1 为根的有根树上,有两个节点 a,b 上各存在一只毛毛虫。这两只毛毛虫只会往深度更大的点前进,当毛毛虫走到叶子节点时会停下。设第一只毛毛虫可能走到的节点为p1,第二只毛毛虫可能走到的节点为p2,你想要知道二元组(p1,p2)的个数(p 1可以等于p2)。一共有 Q 次询问。

区块链毕设网qklbishe.com为您提供问题的解答

树是一张 n 个点 n-1 条边的无向联通图,每两个点都有唯一的一条简单路径。有根树是指以其中一个点为根节点的树,叶子节点是指除根节点外度数为 1 的节点。一个点的度数是指与其相连的点的个数。有根树上,一个点的深度是指其与根节点之间的简单路径的边数。
在某一棵以 1 为根的有根树上,有两个节点 a,b 上各存在一只毛毛虫。这两只毛毛虫只会往深度更大的点前进,当毛毛虫走到叶子节点时会停下。设第一只毛毛虫可能走到的节点为p1,第二只毛毛虫可能走到的节点为p2,你想要知道二元组(p1,p2)的个数(p1可以等于p2)。一共有 Q 次询问。

简单来说就是实现一个函数,求每个节点到底有多少个叶子节点。需要一个hashmap来缓存已经求过的叶子结点。

比如用例里面的,求出来了2往下有2个叶子结点,3往下有3个叶子节点,则1作为2和3的父节点,只需要调用缓存里2和3有多少个叶子结点,然后加起来就是1有多少个叶子节点了。所要求的二元组的个数就是那两个点的叶子结点数相乘,比如第三列的例子1 2中,1有5个叶子节点2有2个叶子结点,则对应了解释(1 6 10 1)里的2*5=10

import java.util.*;  // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {     static HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();     static HashMap<Integer,Integer> leafs = new HashMap<>();      public static void calculateLeafCounts(int currentnode,int parent){         List<Integer> children = map.getOrDefault(currentnode, new ArrayList<>());          int leafcount=0;         boolean haschildren=false;          for(int child:children){//获取到这个邻接表             if (child!=parent){//如果领接表这个节点不是父节点                 haschildren=true;                 calculateLeafCounts(child,currentnode);                 if (map.get(child).size()==1){//领接表长度为1 则是叶子节点                     leafcount++;                 }else{                     leafcount+=leafs.get(child);                 }             }         }         if (!haschildren){             leafcount=1;//在这个题里 叶子结点也对应了一种可能         }         leafs.put(currentnode,leafcount);     }      public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int Q = in.nextInt();         for (int i = 0; i < n-1; i++) {             int u=i+2;//当前点             int v=in.nextInt();//相邻的店             if (!map.containsKey(u)){                 map.put(u, new ArrayList<>());             }             if (!map.containsKey(v)){                 map.put(v, new ArrayList<>());             }             map.get(u).add(v);//邻接表             map.get(v).add(u);         }         int[] Q1=new int[Q];//两个毛毛虫         int[] Q2=new int[Q];         for (int i = 0; i < Q; i++) {             Q1[i]=in.nextInt();         }         for (int i = 0; i < Q; i++) {             Q2[i]=in.nextInt();         }         calculateLeafCounts(1,-1);          long res=0;         for (int i = 0; i < Q; i++) {             int Q1node=leafs.get(Q1[i]);             int Q2node=leafs.get(Q2[i]);             long tempres=Q1node*Q2node;             res=res^tempres;         }         System.out.println(res);     } }

02:06

以上就是关于问题树是一张 n 个点 n-1 条边的无向联通图,每两个点都有唯一的一条简单路径。有根树是指以其中一个点为根节点的树,叶子节点是指除根节点外度数为 1 的节点。一个点的度数是指与其相连的点的个数。有根树上,一个点的深度是指其与根节点之间的简单路径的边数。
在某一棵以 1 为根的有根树上,有两个节点 a,b 上各存在一只毛毛虫。这两只毛毛虫只会往深度更大的点前进,当毛毛虫走到叶子节点时会停下。设第一只毛毛虫可能走到的节点为p1,第二只毛毛虫可能走到的节点为p2,你想要知道二元组(p1,p2)的个数(p 1可以等于p2)。一共有 Q 次询问。的答案

欢迎关注区块链毕设网-
web3一级市场套利打新赚钱空投教程

区块链NFT链游项目方科学家脚本开发培训

从业7年-专注一级市场


微信:btc9767
TELEGRAM :https://t.me/btcok9

具体资料介绍

web3的一级市场千万收益的逻辑


进群点我



qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 树是一张 n 个点 n-1 条边的无向联通图,每两个点都有唯一的一条简单路径。有根树是指以其中一个点为根节点的树,叶子节点是指除根节点外度数为 1 的节点。一个点的度数是指与其相连的点的个数。有根树上,一个点的深度是指其与根节点之间的简单路径的边数。 在某一棵以 1 为根的有根树上,有两个节点 a,b 上各存在一只毛毛虫。这两只毛毛虫只会往深度更大的点前进,当毛毛虫走到叶子节点时会停下。设第一只毛毛虫可能走到的节点为p1,第二只毛毛虫可能走到的节点为p2,你想要知道二元组(p1,p2)的个数(p 1可以等于p2)。一共有 Q 次询问。