题目大意
给出一个多叉树,让你计算每一层叶子节点的个数。第一行给出总节点数n和非叶节点数m,随后m行。格式为ID K ID[1] ID[2] ... ID[K],分别表示父节点ID、孩子个数K、以及各孩子的ID,ID格式为两位数。思路解析
比较容易想到的是图的层序遍历,找该层的叶子节点,每找一个depthnum对应层节点数+1,关键就是记录属于那一层,所以要通过depthtable数组记录该点的深度,每下一层,改点深度层+1,同时记录下最大深度。最后输出每一层深度对应的叶子节点数。代码模板
void BFS(Graph*gra, int v, vector<bool>& visited) {
int n = gra->vexnum;
queue<int> que;
que.push(v);
while (!que.empty()) {
int u = que.front();
que.pop();
if (!visited[u]) {
...do something();
visited[u] = true;
}
for (int i = 0; i < n; i++) {
if ((gra->matrix[u][i] != INF || gra->matrix[i][u] != INF) && u != i) {
if (!visited[i]) {
que.push(i);
...do something();
}
}
}
}
}
示例代码
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#define INF (~(0x1<<31))
using namespace std;
int main() {
int n, m,flag=1,max=0;
cin >> n >> m;
int gra[100][100];
vector<int> depthtable(n + 1, 0);//每个节点的深度表,初始化为0
vector<int> depthnum(m + 1, 0);//每一层叶子节点的个数,初始化为0
fill(gra[0], gra[0] + 100 * 100, INF);
for (int i = 0; i < m; i++) {
int a, k; cin >> a >> k;//a是爸爸的id k是儿子的个数
for(int j = 0; j < k; j++) {
int b; cin >> b;
gra[a][b] = 1;
}
}
queue<int> que;
que.push(1);//根节点入队
while (!que.empty()) {
int a = que.front();
que.pop();
for (int i = 0; i < n+1; i++) {
if (gra[a][i] == 1) {//存在路径
que.push(i);
depthtable[i] = depthtable[a] + 1;//深度+1
if (depthtable[i] > max)
max = depthtable[i];//记录最大深度
flag = 0;//该点不是叶子节点
}
}
if (flag) depthnum[depthtable[a]]++;//该层的叶子节点数目+1
}
for (int i = 0; i < max; i++)
cout << depthnum[i] << " ";
cout << depthnum[max] << endl;
return 0;
}