1004 Counting Leaves (30分)
题目
给一颗节点数不超过 100 的树,求每一层的叶子节点的个数。
分析
建树之后记录每个节点有无孩子,之后 dfs 一下记录每个节点在第几层。将信息归总统计一下即可得出每层叶子节点数。
#include <bits/stdc++.h>
using namespace std;
#define db(x) cout<<x<<endl
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 1e2 + 10;
const ll mod = 2147483648;
int n, m, cur, k, son;
int a[N][N]; // 建树
int has_son[N]; // 记录有无孩子
int level[N]; // 记录每个节点的层数
map<int, int> mp; // 记录每层的答案
int dfs(int rt, int fa, int l) {
level[rt] = l;
for (int i = 1; i <= n; i++) {
if (i != fa && a[rt][i]) {
dfs(i, rt, l + 1);
}
}
}
int main() {
scanf("%d%d", &n, &m);
while(m--) {
scanf("%d%d", &cur, &k);
while (k--) {
scanf("%d", &son);
a[cur][son] = 1;
has_son[cur] = 1;
}
}
dfs(1, 0, 1);
for (int i = 1; i <= n; i++) {
if (!has_son[i]) mp[level[i]]++;
else mp[level[i]] += 0;
}
for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
printf("%d%c", it->second, " \n"[it->first==mp.rbegin()->first]);
}
return 0;
}