做题思路:
建立一棵树,求树上每层的叶结点数量。开个记录深度和记录子节点的结构,如果一个结点没有子节点,那它就是叶结点,当前层数值加一。最后输出每层的叶结点数量。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
const int N = 110;
map<int, int> S;
int n, m;
int cnt[N];
int max_d;
int num[N], idx;
struct Node{
int d;
vector<int> ne;
}e[N];
int get(int x)
{
if(S.count(x) == 0) S[x] = ++ idx;
return S[x];
}
void change_d(int a)
{
vector<int> t = e[a].ne;
int len = t.size();
for(int i = 0; i < len; i ++ )
{
e[t[i]].d = e[a].d + 1;
if(e[t[i]].d > max_d) max_d = e[t[i]].d;
change_d(t[i]);
}
}
int main()
{
scanf("%d%d", &n, &m);
while(m -- )
{
int a, k, b;
scanf("%d %d", &a, &k);
num[get(a)] = a;
for(int i = 0; i < k; i ++ )
{
scanf("%d", &b);
num[get(b)] = b;
e[a].ne.push_back(b);
}
change_d(a);
}
if(idx == 0)
return printf("1") & 0;
for(int i = 1; i <= idx; i ++ )
if(e[num[i]].ne.size() == 0) cnt[e[i].d] ++ ;
for(int i = 0; i <= max_d; i ++ )
{
if(i != max_d) printf("%d ", cnt[i]);
else printf("%d", cnt[i]);
}
return 0;
}