A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input Specification:
The input consists of several test cases, each starts with a line containing 0<N<1000<N<1000<N<100, the number of nodes in a tree, and MMM (<N<N<N), the number of non-leaf nodes. Then MMM 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 NNN 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.
For example, the first 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
1 0
7 4
01 2 02 03
06 1 07
02 2 04 05
03 1 06
0 0
Sample Output:
0 1
1
0 0 2 1
这里个人用的是vector 才刚开始会点c++的 代码有点长
#include <stdio.h>
#include <vector>
using namespace std;
vector<int>tree[1005], high[1005];
int check(int num)
{
if (!tree[num].size()) return 1;
return 0;
}
int main()
{
int n, m;
while (scanf("%d %d", &n, &m), n) {
high[1].push_back(1);
int i = 0, j,c=1,flag=0,f=0;
while (m--) {//save m
int num, cont,k;
scanf("%d %d", &num, &cont);
for (i = 0; i < cont; i++) {
scanf("%d", &k);
tree[num].push_back(k);
}
}//save m
int cont1 = 1;
for (c = 2; ; c++) {
if (c == 2) {
if (!check(1)) {
for (i = 0; i < tree[1].size(); i++) {
high[c].push_back(tree[1][i]);
cont1++;
}
}
else { printf("1"); f = 1; break; }
}
else {
for (i = 0; i < high[c - 1].size(); i++) {
int s = high[c - 1][i];
for (j = 0; j < tree[s].size(); j++) {
high[c].push_back(tree[s][j]);
cont1++;
}
}
}
if (cont1 == n)break;
}
if (!f) {
printf("0");
flag = 1;
for (i = 2; i <= c; i++) {
int cont2=0;
for (j = 0; j < high[i].size(); j++)
cont2 += check(high[i][j]);
printf(" %d", cont2);
}
}
for (i = 0; i <= n; i++) {
tree[i].clear();
high[i].clear();
}
printf("\n");
}
return 0;
}