#include<iostream>
using namespace std;
#include<map>
#include<vector>
map<int, vector<int>>adjlist; //每一个int对应一个数组索引
int levelleaves[101];
void dfs(int node, int level)
{
if (adjlist[node].empty()) //node那一行是不是空的,是空的,说明这层有叶节点,就加一
{
levelleaves[level]++;
return;
}
vector<int>::iterator itea = adjlist[node].begin(); //记住node行的开始
for (;itea != adjlist[node].end(); itea++)//node的结尾相比较,每到一个node的儿子就dfs,返回的是儿子那一层的叶节点数,所以层数加一
{
dfs(*itea, level+1);
}
}
int main()
{
int N, M;
cin >> N >> M;
int leaves = N - M;
for (int i = 0; i < M; i++)
{
int id1, k, id2;
cin >> id1 >> k;
for (int j = 0; j < k; j++)
{
cin >> id2;
adjlist[id1].push_back(id2); //id2加在node-id1那行的最后
}
}
dfs(1, 0);
int a = levelleaves[0];
cout << a;
for (int i = 1; a < leaves; i++)
{
cout << " " << levelleaves[i]; //因为不知道有几行,所以用a算了下叶子结点数
a += levelleaves[i];
}
return 0;
}
参考https://www.cnblogs.com/Qmelbourne/p/6057337.html
多次dfs,每次dfs统计每一层的一个node的叶子结点数