A 1004 Counting Leaves
Problem Description
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input
Each input file contains one test case. Each case starts with a line containing 0<N<100, the number of nodes in a tree, and M (<N), the number of non-leaf nodes. Then M lines follow, each in the format:
ID K ID[1] ID[2] ... ID[K]
where ID
is a two-digit number representing a given non-leaf node, K
is the number of its children, followed by a sequence of two-digit ID
's of its children. For the sake of simplicity, let us fix the root ID to be 01
.
The input ends with N being 0. That case must NOT be processed.
Output
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.
The sample case represents a tree with only 2 nodes, where 01
is the root and 02
is its only child. Hence on the root 01
level, there is 0
leaf node; and on the next level, there is 1
leaf node. Then we should output 0 1
in a line.
Sample Input:
2 1
01 1 02
Sample Output:
0 1
题目大意:
有n个节点和m个非叶子节点,输入m行数据,分别是每个非叶子节点的子节点数量和对应的id。输出每一层的叶子结点数量(叶子节点就是没有子节点的节点)。
解题思路:
分层搜索,第一个想到的就是广度优先搜索BFS,再用一个数组level记录每一层的叶子节点数量。题目规定根节点(第0层)的id是1,故从1开始遍历即可,bfs传递的参数的节点id和该节点所在的层数,具体方法看代码理解。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define max(a, b) ((a) > (b) ? (a) : (b))
const int maxn = 105;
vector<int> leaf[maxn]; //每个id的子节点
int level[maxn]; //每一层的叶子节点数
int maxlvl=0; //最大层数
void bfs(int ID, int lvl){
int limit = leaf[ID].size(); //该节点的子节点数量
maxlvl = max(maxlvl, lvl); //记录最大层数
if(limit == 0){
level[lvl]++;
return ;
}
for(int i=0; i<limit; i++){
bfs(leaf[ID][i], lvl+1);
}
}
int main(int argc, char **argv){
int n,m,id,k,idk;
fill(level, level+maxn, 0);
scanf("%d%d",&n,&m);
if(m==0){
printf("1");
}else{
while(m--){
cin>>id>>k;
while(k--){
cin>>idk;
leaf[id].emplace_back(idk);
}
}
bfs(1,0);
bool flag=true;
for(int i=0; i<=maxlvl; i++){
if(flag){
flag=false;
printf("%d",level[i]);
}else{
printf(" %d",level[i]);
}
}
}
return 0;
}