米哈游23-08-13笔试第二题

米小游拿到了一棵有根树,树上有 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)

猜你喜欢

转载自blog.csdn.net/qq_51118755/article/details/132298644