米小游拿到了一棵有根树,树上有 n个节点,根节点编号为1,所有边的长度均为1。
米小游每一次操作可以将一个新叶子节点接在原来的一个叶子上,新加的边的边长度也是1。米小游可以进行任意次操作。
她想知道,操作结束后,与根节点的距离不超过k 的节点个数的最大值是多少。
输入描述
第一行输入两个整数n(1<=n<=10^5),k(0<=k<=10^9)
接下来n-1行,每行输入两个整数u,u(1<=u,v<=n)表示节点u和节点v之间有一条边。
输出描述
输出一个整数表示答案。
示例1
输入
4 2
1 2
1 3
2 4
输出
5
说明
如下图,1号节点为根节点(粉色),初始时3号节点和4号节点为叶子节点,可以在3号节点上增加一个叶子节点,也就是5号节点(蓝色)。在4号节点上增加节点并不会影响答案,因此答案为5。
思路
我们针对所有节点进行广度优先遍历,记录每个点与根节点的距离,以及这个点是否为叶子节点
当一个节点是叶子节点时,k-他与根节点的距离即为这个点可以再扩充的点数,我们累加所有节点和可扩充点数即可
代码
from collections import deque
n,k = map(int,input().split())
edge = [[] for i in range(n+1)]
for i in range(n-1):
x,y = map(int,input().split())
edge[y].append(x)
edge[x].append(y)
que = deque()
que.append(1)
dis = [-1 for i in range(n+1)] #记录点到根节点的距离
leaf = [True for i in range(n+1)] #记录每个节点是否是叶子节点
dis[1]=0
while 0<len(que):
x = que.popleft()
for y in edge[x]:
if dis[y] == -1: #如果y点没有被遍历
leaf[x] = False
dis[y] = dis[x] + 1
que.append(y)
ans = 0
for i in range(1,n+1):
if dis[i] > k:
continue
ans += 1
if leaf[i]:
ans += k-dis[i]
print(ans)
print(ans)