题目大意
给一颗树,要求树上每层叶子节点数量
输入
每组包含一个测试用例,每组第一行包含 0 < N < 100 0<N<100 0<N<100 (树的结点的数量), M < N M<N M<N(非叶子节点数量),然后有 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)