题目大意
Input:
第一行 M N 分别是 总节点个数 非叶节点个数
接下来的N行中的某一行: 第一个值ID为当前非叶节点序号 K为有几个孩子 然后依次是K个孩子的节点序号
例如
01
02 03
04 ←这样一棵树
有:M = 4 N = 2
ID = 01 K = 2 02 03
ID = 02 K = 1 04
Output:
输出每一层有几个叶节点
此用例应该输出
0 1 1
#include<iostream>
#include<vector>
using namespace std;
vector<int> node,res;//node 当前下标位置对应的节点序号, res 保存第i层有几片叶子
vector<vector<int> > nodpos; //2列的二维数组 分别保存在node的下标位置和孩子个数
int ct = 0;
void solve(int pos,int n,int t){
if(n == 0) {
res[t] ++; //递归t次满足条件 故第t层++
ct = max(ct,t);
return;
}
for(int i = 0; i < n ; i++)
solve(nodpos[node[pos+i]][0],nodpos[node[pos+i]][1],t+1);
}
int main(){
int m,n,allcount = 1,nd,cnt,i = 1;
cin >> m >> n;
node = vector<int>(m+1,0);
nodpos = vector<vector<int> >(m+1,vector<int>(2,0));
res = vector<int>(m+1,0);
for(int i = 0; i < n ; i ++){
cin >> nd;
nodpos[nd][0] = allcount;
cin >> cnt;
nodpos[nd][1] = cnt;
for(int j = 0; j < cnt; j++){
cin >> node[allcount];
allcount++;
}
}
solve(nodpos[1][0],nodpos[1][1],0); //进入DFS
while(i<=ct){
cout << res[i] ;
if(i!=ct)cout<< " ";
i++;
}
return 0;
}