树的重心
作者:
成理第一深情
,
2024-05-10 10:39:42
,
所有人可见
,
阅读 22
"""
思路:
1、任取一点u,若以u为重心,则分为两类,一类是u的子树,一类是u上面的部分
2、需要算出u的最大子树的结点数和u上面部分的结点数,然后取二者的最大值即可
size:记录u的最大子树的结点数
sum:记录以u为根的子树的结点数
n-sum:u上面部分的结点数
ans = max(size, n - sum)
"""
from collections import defaultdict
import sys
sys.setrecursionlimit(1000000)
input = sys.stdin.readline
def dfs(u):
global ans
st[u] = 1 # 表示u已经被搜过了
size = 0 # 记录u的最大子树的结点数
sum = 1 # 记录以u为根的子树的结点数
for j in graph[u]:
if st[j]:
continue
s = dfs(j) # s是以j为根的子树的节点数
size = max(s, size)
sum += s
ans = min(ans, max(size, n - sum))
return sum
n = int(input().strip())
graph = defaultdict(list)
for i in range(n - 1):
a, b = map(int, input().strip().split())
graph[a].append(b)
graph[b].append(a)
st = [0 for _ in range(n + 1)]
ans = float("inf")
dfs(1)
print(ans)