最大子叉树结点数--Python

题目可以各种花样:

比如树状座位图逃生,每人在一个结点上每秒只能走一步,除了根节点其他结点只能容纳一个人,求最短移动时间;

比如给定一棵树,每个节点上有一只鸟,每秒钟每只鸟都可以从一个节点移动到相邻节点上,但每秒钟每条边只能承载一只鸟的飞行.问所有鸟移动到根节点(1号节点)所花的时间.

仔细分析这些题目都是求多叉树的子叉树上的最大结点数

输入:

n行:第一行是结点数,其余n-1行是其他结点的相连结点;

样例:

6

2 1

3 2

4 3

5 2

6 1

输出:

最短移动时间

样例输出:4
代码:

#-*- coding:utf-8 -*-
import sys
def node(child,root): 
    num = 1
    for i in dict[child]:
        if i != root:
            num = num + node(i,child)
    return num
if __name__ == "__main__":
   global dict
   dict = {}  
   n = sys.stdin.readline() #按行输入
   for i in range(int(n)-1):
       line = sys.stdin.readline().strip('\n')
       a = line.split(" ")[0]
       b = line.split(" ")[1]
       if a not in dict:
           dict[a] = [b]
       else:
           dict[a].append(b)
       if b not in dict:
           dict[b] = [a]
       else:
           dict[b].append(a)
   print(dict)  
   nodenum = 0
   for i in dict['1']:
       nodenum = max(nodenum,node(i,'1'))
   print(nodenum)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值