Counting Leaves
原题链接
题目描述:
给你一个家族树,要求你输出树的每一层中叶子节点个数,数据范围(1—99)。
思路如下:
- 申请一个大小为100的数组,对于每个输入构造并查集,循环一次即可得到每一个节点的层次;
- 申请一个大小为100的bool型数组,初值为false,有后代时设置为true(区分叶子节点)
- 最后再次循环把叶子节点按层次计数输出即可
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int N, M, maxfloor=0;
int a[100] = {0}, floor[100] = {0}, ans[100] = {0};
bool ischild[100] = {false};
cin >> N >> M;
for (int i=0; i<M; i++)
{
int k, elder;
scanf("%d %d",&elder, &k);
ischild[elder] = true;
for (int j=0; j<k; j++)
{
int child;
scanf("%d",&child);
a[child] = elder;
}
}
for (int i=1; i<=N; i++)
{
int cnt = 0, node = i;
while (a[node]!=0 && floor[node]==0)
{
cnt++;
node = a[node];
}
if (a[node]==0)
floor[i] = cnt;
else if(floor[node] != 0)
floor[i] = floor[node] + cnt;
if (floor[i] > maxfloor)
maxfloor = floor[i];
}
for (int i=1; i<=N; i++)
{
if (ischild[i] == false)
ans[floor[i]]++;
}
for (int i=0; i<maxfloor; i++)
cout << ans[i] << ' ';
cout << ans[maxfloor];
return 0;
}