【剑指紫金港】1004 Counting Leaves 入门级广度优先搜索(BFS)

A 1004 Counting Leaves

题目链接

Problem Description

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 IDis a two-digit number representing a given non-leaf node, Kis 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 N being 0. That case must NOT be processed.

Output

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.

The sample case represents a tree with only 2 nodes, where 01is the root and 02is its only child. Hence on the root 01level, there is 0leaf node; and on the next level, there is 1leaf node. Then we should output 0 1in a line.

Sample Input:

2 1
01 1 02

Sample Output:

0 1

题目大意

有n个节点和m个非叶子节点,输入m行数据,分别是每个非叶子节点的子节点数量和对应的id。输出每一层的叶子结点数量(叶子节点就是没有子节点的节点)。

解题思路

分层搜索,第一个想到的就是广度优先搜索BFS,再用一个数组level记录每一层的叶子节点数量。题目规定根节点(第0层)的id是1,故从1开始遍历即可,bfs传递的参数的节点id和该节点所在的层数,具体方法看代码理解。

AC代码

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define max(a, b) ((a) > (b) ? (a) : (b))

const int maxn = 105;

vector<int> leaf[maxn];  //每个id的子节点
int level[maxn];  //每一层的叶子节点数
int maxlvl=0;  //最大层数

void bfs(int ID, int lvl){
    int limit = leaf[ID].size();  //该节点的子节点数量
    maxlvl = max(maxlvl, lvl);  //记录最大层数
    if(limit == 0){
        level[lvl]++;
        return ;
    }
    for(int i=0; i<limit; i++){
        bfs(leaf[ID][i], lvl+1);
    }
}

int main(int argc, char **argv){
    int n,m,id,k,idk;
    fill(level, level+maxn, 0);
    scanf("%d%d",&n,&m);
    if(m==0){
        printf("1");
    }else{
        while(m--){
            cin>>id>>k;
            while(k--){
                cin>>idk;
                leaf[id].emplace_back(idk);
            }
        }
        bfs(1,0);
        bool flag=true;
        for(int i=0; i<=maxlvl; i++){
            if(flag){
                flag=false;
                printf("%d",level[i]);
            }else{
                printf(" %d",level[i]);
            }
        }
    }
    return 0;
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

征服所有不服

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值