1004 Counting Leaves
公告我的新站https://wigginsgao.github.io/GWJ2026/原题链接中文解释家庭关系可以用家谱树来表示给定一个家谱树你的任务是找出其中没有孩子的成员。输入格式第一行包含一个整数N表示树中结点总数以及一个整数M表示非叶子结点数。接下来M行每行的格式为ID K ID[1] ID[2] ... ID[K]I**D是一个两位数字表示一个非叶子结点编号K是一个整数表示它的子结点数接下来的K个I**D[i] 也是两位数字表示一个子结点的编号。为了简单起见我们将根结点固定设为 01。所有结点的编号即为 01,02,03,…,31,32,33,…,N。输出格式输出从根结点开始自上到下树的每一层级分别包含多少个叶子节点。输出占一行整数之间用空格隔开。数据范围0N100输入样例2 1 01 1 02输出样例0 1样例解释该样例表示一棵只有 2 个结点的树其中 01 结点是根而 02 结点是其唯一的子节点。因此在根这一层级上存在 0 个叶结点在下一个级别上有 1 个叶结点。所以我们应该在一行中输出0 1。题解数据结构选择使用vector数组构建邻接表存储树结构v[u]表示节点u的所有子节点列表相比数组模拟链表更简洁易读。遍历方式采用 DFS 递归遍历整棵树记录每个节点的层数。统计逻辑遇到叶子节点子节点列表为空时对应层数的叶子数计数 1并更新树的最大深度。结果输出按层数从 0 到最大深度输出统计结果。#includeiostream #includealgorithm #includevector #includecstdio #includestring #includecstring #includecctype #includecmath #includemap #includeset #includeclimits using namespace std; int n, m; vectorint v[110]; int cnt[110]; int max_depth; void dfs(int u, int depth) { if(v[u].size() 0) { //是叶节点 cnt[depth]; max_depth max(max_depth, depth); return; } for(int i 0; i v[u].size(); i) { int e v[u][i]; dfs(e, depth1); } } int main() { cin n m; for(int i 0; i m; i) { int id, k; cin id k; while(k--) { int son; cin son; v[id].push_back(son); } } dfs(1, 0); //从根节点开始根节点层数为0 cout cnt[0]; for(int i 1; i max_depth; i) { cout cnt[i]; } cout endl; return 0; }