题目:
见https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184
思路:
我之前的错误做法大概可以拿13分,英文题面没理解的很透彻,我大概理解的就是觉得它的输入时逐层输入的结点信息。正确思路我是参考的这个博客https://blog.csdn.net/qq_24452475/article/details/99700031,
他是用vector[parent]存入每个parent的子节点,然后再从根节点开始dfs,统计每层的叶子结点数
代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e2+10;
vector<int> v[N];
int leaf[N];
int max_h=1;
void dfs(int inx,int h)
{
max_h=max(h,max_h);
if(v[inx].size()==0)
{
leaf[h]++;
return;
}
for(int i=0;i<v[inx].size();i++)
dfs(v[inx][i],h+1);
}
int main()
{
int n,m,parent,child,k;
cin>>n>>m;
for(int i=0;i<m;i++)
{
cin>>parent>>k;
for(int j=0;j<k;j++)
{
cin>>child;
v[parent].push_back(child);
}
}
dfs(1,1);
cout<<leaf[1];
for(int i=2;i<=max_h;i++)
cout<<" "<<leaf[i];
return 0;
}