A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input Specification:
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 Specification:
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
#include<iostream>
#include<cstring>
using namespace std;
const int N = 110;
int h[N],e[N],ne[N],idx,cnt[N],m,n,q[N];
bool has_father[N];
void add(int a,int b){
e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
void bfs(int u){
int hh = 0,tt = 0;
q[0] = u;
int level = 1;
while(hh<=tt){
int head = hh, tail = tt;
while(hh<=tail){
int t = q[hh++];
for(int i = h[t];~i;i = ne[i]){
int j = e[i];
if(h[j]==-1) cnt[level+1]++;
q[++tt] = j;
}
}
level ++;
}
printf("%d",cnt[1]);
for(int i = 2;i<level;i++){
printf(" %d",cnt[i]);
}
}
int main(){
memset(h,-1,sizeof h);
scanf("%d %d",&n,&m);
if(m==0) {
puts("1");
return 0;
}
while(m--){
int pid,k;
scanf("%d %d",&pid,&k);
while(k--){
int cid;
scanf("%d",&cid);
add(pid,cid);
}
}
bfs(1);
}