PAT Counting Leaves[一般]

1004 Counting Leaves (30)(30 分)

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.

Output

For each test case, you are supposed to count those family members who have no child for every seniority levelstarting 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

参考这个:http://www.cnblogs.com/linkstar/p/5674895.html
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
//给出节点总数和非叶节点数,并且给出非叶节点的子节点,输出每层有几个叶节点。
struct node{
    int hir;
    int father;
    int son;
    node(){
    hir=0;son=0;father=0;}
}node[101];
int ceng[101];

int main()
{
    //首先我的问题是这个树怎么存的,用数组来存?
    //关键是要表示出来层数信息。
    int n,m;
    //freopen("1.txt","r",stdin);
    cin>>n>>m;
    int id,k,idk;
    node[1].hir=1;
    for(int i=0;i<m;i++){
        cin>>id>>k;
        node[id].son+=k;
        for(int j=0;j<k;j++){
            cin>>idk;
            node[idk].father=id;//层数+1
        }
    }
    //接下来就是要判断每层上一共有多少个叶子节点了。
    //有一个小小的疑问就是,是不是层数按序号输入的呢?还是说每次找第几层的都要把所有的给便利一下?
    //需要注意的是有可能新输入的父节点等级并没有确定。
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
         if(node[j].father==i)
                //node[i].son++;
                node[j].hir=node[i].hir+1;//从第一个点也就是根节点开始遍历,那么肯定可以顺序确定。
        }
    }

    int maxs=0;
    for(int i=1;i<=n;i++){
        if(node[i].son==0){
            ceng[node[i].hir]++;
            if(node[i].hir>maxs)
                maxs=node[i].hir;
        }
    }
    for(int i=1;i<=maxs;i++){
        cout<<ceng[i];
        if(i!=maxs)cout<<" ";
    }
    return 0;
}

//大意就是输入一个值表示树中节点总数,另一个数表示非叶节点总数,接下来就是输入树的层次结构。要求判断出每一层有多少个叶节点并且输出。

第一次提交0分,因为是我有中间输入忘了注释,和freopen没有注释掉。之后提交是19分,看完链接中的代码之后就发现是因为我没有考虑点输入的先后顺序,有可能父节点输入的时候它的等级并没有确定,所以就需要一个字段father来记录,最后再有一个两层循环(这个时间复杂度就上去了,不过由于题目数据比较小,所以可用)。先记录父子关系,再循环确定层次关系,最后用哈希数组判断每层的叶结点个数即可。总的来说还可以。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9335206.html