zoukankan      html  css  js  c++  java
  • 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来记录,最后再有一个两层循环(这个时间复杂度就上去了,不过由于题目数据比较小,所以可用)。先记录父子关系,再循环确定层次关系,最后用哈希数组判断每层的叶结点个数即可。总的来说还可以。

  • 相关阅读:
    Postfix之mail.cf
    利用 Postfix 抵擋垃圾信
    安装webmin
    Win7 登入提示临时漫游档案
    squid 延伸
    禁止VMware用户在系统里删除网卡的操作的方法
    Squid Proxy Server 3.1
    使用RBL拦截垃圾邮件
    建置 POSTFIX 服务器
    Seednet 访问路径
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9335206.html
Copyright © 2011-2022 走看看