算法题 树的重心(Python)

39 篇文章 0 订阅
11 篇文章 1 订阅

题目

给定一颗树,树中包含n个结点(编号1~n)和n-1条无向边。

请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。

重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。

输入格式

第一行包含整数n,表示树的结点数。

接下来n-1行,每行包含两个整数a和b,表示点a和点b之间存在一条边。

输出格式

输出一个整数m,表示将重心删除后,剩余各个连通块中点数的最大值。

数据范围

 

1≤n≤10^5

输入样例

9
1 2
1 7
1 4
2 8
2 5
4 3
3 9
4 6

输出样例:

4

代码 

n = int(input())
idx = 0
h, e, ne = [-1]*(n+1), [0]*(2*n+2), [0]*(2*n+2)
st = [False]*(n+1)
min_num = n

def add(a, b):
    global idx
    e[idx] = b
    h[a], ne[idx] = idx, h[a]
    idx += 1

def dfs(cur_idx):
    global min_num, n
    st[cur_idx], sum1, i, res = True, 1, h[cur_idx], 0
    while i != -1:
        next_idx = e[i]
        if not st[next_idx]:
            s = dfs(next_idx)
            res = max(res, s)
            sum1 += s
        i = ne[i]
    res = max(res, n-sum1)
    min_num = min(res, min_num)
    return sum1

for i in range(n-1):
    a, b = map(int, input().split())
    add(a, b)
    add(b, a)

dfs(1)
print(min_num)


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值