PAT1 1004 Counting Leaves

题目链接
我的github

题目大意

给一颗树,要求树上每层叶子节点数量

输入

每组包含一个测试用例,每组第一行包含 0 < N < 100 0<N<100 0N100 (树的结点的数量), M < N M<N MN(非叶子节点数量),然后有 M M M行,每行的格式为:

ID K ID[1] ID[2] … ID[K]

ID代表一个非叶子节点的编号,K表示它的孩子的数量,后面跟着它孩子的编号,假定根节点的编号是1
输入以 N N N为0结束,此时不用处理

输出

在一行中输出每层的叶子节点数量,以空格分开且行尾不允许有空格

样例输入

2 1
01 1 02

样例输出

0 1

解析

使用邻接矩阵存放这颗树,然后使用dfs遍历求出每一层的叶子节点的数量

def dfs(cnt, node):
    if num[cnt] == -1:  #这层还没到达过
        num[cnt] = 0
    if grep[node][node] != -2:  #当前node节点没有孩子  
        num[cnt] += 1
        return
    for i in range(n + 1):  #遍历node节点的每个孩子
        if grep[node][i] == 1:
            dfs(cnt + 1, i)
    return


line = input()
if line == '' or len(line.split()) == 1:
    exit(0)
n, m = map(int, line.split())
if n == 0:
    exit(0)
num = [-1 for i in range(101)]  #存放每层的叶子节点数量
grep = [[-1 for i in range(n + 2)] for j in range(n + 2)]   #存放这棵树
for i in range(m):
    tmp = [int(x) for x in input().split()]
    fa = tmp[0]
    grep[fa][fa] = -2   #如果是非叶子节点将其标记为-2
    for j in range(tmp[1]):
        grep[fa][tmp[j + 2]] = 1
dfs(0, 1)
for i in range(101):
    if num[i] == -1:
        break
    print(num[i], end=('\n' if num[i + 1] == -1 else ' '))
exit(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值