很奇怪,难点不在于题,而是读懂题……英语就让我有点😓,读不懂题目,感觉这些题是不是有配书啊,风格和力扣差别很大,用二维数组表示树我也不熟悉……但好歹看懂了题目(表示很无语,真的很无语)
题目里输入的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函数一开始分配在栈上的内存是有一定的范围的(大概是这个意思)。