1004 Counting Leaves (30 分)

很奇怪,难点不在于题,而是读懂题……英语就让我有点😓,读不懂题目,感觉这些题是不是有配书啊,风格和力扣差别很大,用二维数组表示树我也不熟悉……但好歹看懂了题目(表示很无语,真的很无语)
题目里输入的N没有用吧,我反正没用到,
M(<N)表示非叶节点数???(我黑人脸)
猜测下“01 1 02”的意思是,父节点是01,有1个孩子,孩子是02,(02这个点算1层)
我们可以在修改上面那个案例,验证我们的想法:
9(随便写的) 2(m为2)
01 3 02 03 04 02 2 05 06

毫无疑问,这个案例的答案是 0 2 2 (第一层只有根节点01,第二层的叶节点有 03 04,第三层的叶节点有 05 06)。
这下应该能理解该题的意图了。
(但我还是无法翻译该题的英文……)
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
vector<int> trees[100];
vector<int> ans(100);
int maxn=-1;
void dfs(int index,int depth){
    if(trees[index].size()==0){
        ans[depth]++;
        maxn=max(maxn,depth);
        return ;
    }
    for(auto &n:trees[index]){
        dfs(n,depth+1);
    }
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int node,k,child;
        cin>>node>>k;
        for(int j=0;j<k;j++){
            cin>>child;
            trees[node].push_back(child);
        }
    }
    dfs(1,0);
    cout<<ans[0];
    for(int i=1;i<=maxn;i++) cout<<' '<<ans[i];
    return 0;
}

ps.我今天学到的新知识,开辟大数组最好是全局区的,因为main函数一开始分配在栈上的内存是有一定的范围的(大概是这个意思)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值