PAT甲级题目1004 Counting Leaves

题目大意:
hierarchy(层级)pedigree(家谱)
给出家谱,求出没有孩子的家庭成员

输入:
①第一行两个整数
N:树中节点个数 M:非叶子节点个数
②剩下
M
行,每行格式为:ID K ID[1] ID[2] … ID[K]
ID:两位数表示一个非叶子节点 K:孩子的个数 然后接着K个孩子的ID
③根节点为
01

输出:
输出每一层上叶子节点的个数

思路:
用vector数组v保存每个节点的孩子ID,数组number保存每层上叶子节点的个数,level数组保存每个节点是第几层次,采用bfs利用队列遍历每个节点求出结果
代码:

#include
#include
#include
#include
using namespace std;
int n,m,k,index,child;
vector<int> v[100];
queue<int> q;
int number[100];
int level[100];
int maxlevel;
void bfs()
{
    q.push(1);//把根节点放入队列
    level[1]=1;//根节点层次为1
    while(!q.empty())
    {
        int index=q.front();
        q.pop();
        maxlevel=max(level[index],maxlevel);//为了求得最大层次是多少
        if(v[index].size()==0)//节点为叶子节点,所在层次叶子节点个数+1
            number[level[index]]++;
        for(int i=0;i<v[index].size();i++)
        {
            q.push(v[index][i]);
            level[v[index][i]]=level[index]+1;//节点孩子的层次为节点层次+1
        }
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&index,&k);
        for(int j=1;j<=k;j++)
        {
            scanf("%d",&child);
            v[index].push_back(child);
        }
    }
    bfs();
    for(int i=1;i<=maxlevel;i++)
    {
        printf("%d",number[i]);
        if(i!=maxlevel)
            printf(" ");
    }
    return 0;
}

觉得有帮助的小伙伴点个赞吧!!!谢谢!!!

你可能感兴趣的:(PAT甲级题目,算法,数据结构,队列,PAT,真题)