魔法王国一共有n个城市,编号为0~n-1号,n个城市之间的道路连接起来恰好构成一棵树。
小易现在在0号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动L次。
如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意0号城市已经游历了,游历过的城市不重复计算)。
输入描述:
输入包括两行,第一行:(两个正整数)n表示城市个数(2 ≤ n ≤ 50)和L易能行动的次数(1 ≤ L ≤ 100)。
第二行:(n-1个整数)(i表示输入n-1个整数的顺序)parent[i](0 ≤ parent[i] ≤ i), 对于每个合法的i(0 ≤ i ≤ n - 2),在(i+1)号城市和parent[i]间有一条道路连接。
输出描述:
输出一个整数,表示小易最多能游历的城市数量。
构成的树:
分三种情况讨论:
1. 当 步长 小于 树的最大深度,输出 步长+1(0城市本身已经游历过)
2. 当 步长 大于 树的最大深度且不能走完全部的城市
条件是:步长>树的最大深度 && (步长-树的最大深度)/2 + 树的最大深度 + 1 < 城市数量n
3. 当 步长 大于 树的最大深度且能走完全部的城市
JAVA实现代码:
import java.util.Scanner;
public class JourneyOfKingdom {
private static int[] parent = new int[100];
public static void main(String[] args){
//输入数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int l = scanner.nextInt();
scanner.nextLine();
for(int i=1;i <= n-1;i++){
parent[i]=scanner.nextInt();
}
//递归出每个节点的深度
int[] nodeDepth = new int[n];
for(int i=1;i <= n-1;i++){
regression(i);
nodeDepth[i] = regression(i);
}
//遍历全部节点,找出最大深度
int maxDepth=0;
for(int i=1;i <= n-1;i++){
if(nodeDepth[i] >= maxDepth){
maxDepth = nodeDepth[i];
}
}
//判断情况
if(l <= maxDepth){
System.out.println(l+1);
}else if(l > maxDepth && (l-maxDepth)/2 + maxDepth +1 < n){
System.out.println( (l-maxDepth)/2+maxDepth+1 );
}else{
System.out.println( n );
}
System.exit(0);
}
private static int regression(int i){
if(i == 0){
return 0;
}
return regression(parent[i])+1;
}
}