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