思路:多源bfs。首先我们要弄清楚Sekai点是什么?其实就是度数为1的叶子节点,我们要找与Sekai点相距最近的最大距离Miku点,就只需要把所有Sekai点收集起来,做一个多源bfs,就可以得到Sekai点到其他Miku点的最短距离。然后统计其中的最大值及其出现次数,并且根据要求输出答案即可
代码:
import sys
from collections import deque
input = lambda: sys.stdin.readline().strip()
import math
inf = 10 ** 18
def I():
return input()
def II():
return int(input())
def MII():
return map(int, input().split())
def LI():
return input().split()
def LII():
return list(map(int, input().split()))
def LFI():
return list(map(float, input().split()))
fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))
'''
'''
def solve():
n = II()
g = [[] for _ in range(n + 1)]
deg = [0] * (n + 1)
dis = [0] * (n + 1)
for _ in range(n - 1):
u, v = MII()
g[u].append(v)
g[v].append(u)
deg[u] += 1
deg[v] += 1
vis = [False] * (n + 1)
q = deque([i for i in range(1, n + 1) if deg[i] == 1])
for i in q:
vis[i] = True
while q:
for _ in range(len(q)):
u = q.popleft()
for v in g[u]:
if vis[v]:
continue
vis[v] = True
dis[v] = dis[u] + 1
q.append(v)
mx = max(dis[1:])
ans = []
for i in range(1, n + 1):
if dis[i] == mx:
ans.append(i)
print(len(ans))
print(*ans)
# t = 1
t = II()
for _ in range(t):
solve()

京公网安备 11010502036488号