PAT 甲级1004 Counting Leaves(vector模拟树)

1004 Counting Leaves

题目说明:

给定一棵树的节点总数N(0<N<100)和非叶节点总数M,以及非叶节点的孩子情况来计算每层的叶节点数

输入输出解释:

Sample Input:

2 1 //树共有两个节点,1个非叶节点
01 1 02 //第一个非叶节点序号为1,有一个子节点2

Sample Output:

0 1 //第一层没有叶结点(只有1号根节点),第二层有一个叶结点(2号节点)

注意的地方

  1. 注意只有一个根节点时输出1,第一层1号节点既是根节点也是叶结点
  2. 在给非叶节点时,不一定按照1-2-3-4顺序给出,也就是可能先给你子节点信息,再给你父节点信息,这样建树或者存储时候都得考虑(不考虑这个提交时候卡1,3测试点)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    vector<vector<int>>dic(100); //存每个节点的子节点,dic[i]代表i的子节点
    vector<int>level(100);  //存每个节点所在层数
    vector<int>leaves(100, 0); //leaves[i]代表i层的叶子节点数
    level[1] = 1;      //根节点在1层
    int n, m;
    cin>>n>>m;
    if(n == 1)
    {
        cout<<1;
        return 0;
    }
    
    for(int i = 0; i < m; i++)
    {
        int num, k;
        cin>>num>>k;
        for(int j = 0; j < k; j++)
        {
            int t;
            cin>>t;
            dic[num].push_back(t);
        }
    }//end fori
    
    for(int i = 1; i < 100; i++)
    {
        if(!dic[i].empty())
        {
            
           for(auto c : dic[i])
           {
                level[c] = level[i] + 1;
                if(dic[c].empty())
                  leaves[level[c]]++; 
           }
        }
    }//end fori
   
    int max_leve = *max_element(level.begin(), level.end());
    for(int i = 1; i <= max_leve; i++)
    {
        if(i == max_leve)
            cout<<leaves[i];
        else
            cout<<leaves[i]<<' ';
    }
        
    
}

结果

posted @ 2021-02-23 13:07  liushz  阅读(87)  评论(0)    收藏  举报