您的位置:首页 > 其它

Counting Leaves

2016-07-19 21:27 253 查看
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 101 1 02
1 0
7 401 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: