https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184
看到这个题目,马上就想到了广搜。但是需要单独开一个数组,用来区分每个点属于哪一个层,同时记录每个层叶节点个数。
下面是 bfs的:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<string.h>
using namespace std ;
int level[100];//一开始不知道所在的层数,因此需要level用来记录区分
int Count[100];//记录每层的个数
vector<int> Link[100] ;
int maxlevel = -1 ;
void bfs(){
queue<int> que ;
que.push(1);
level[1] = 1 ;
while(!que.empty())
{
int index = que.front();
que.pop();
maxlevel = max(maxlevel,level[index]);
if(Link[index].size()==0)
{
Count[level[index]] ++;
}else {
for(int i = 0 ; i < Link[index].size(); i ++)
{
level[Link[index][i]] = level[index]+1;
que.push(Link[index][i]);
}
}
}
}
int main(){
int n , m , node, num , to;
for(int i = 0 ; i < 100 ; i ++)
{
Link[i].clear();
}
memset(Count,0,sizeof(Count));
cin >> n >> m ;
maxlevel =-1 ;
for(int i = 0 ; i < m ; i ++)
{
cin >> node >> num;
for(int i = 0 ; i < num ; i ++)
{
cin >> to ;
Link[node].push_back(to);
}
}
bfs();
printf("%d",Count[1]);
for(int i = 2 ; i <=maxlevel ; i ++ )
{
printf(" %d",Count[i]);
}
printf("\n");
return 0 ;
}
下面是 dfs的,在dfs里直接记录一个depth,就可以记录层数。也很简单。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v[100];
int book[100];
int maxDepth=-1;
void dfs(int index,int depth){
// 此时第index结点已经没有子结点了,则表明是叶子结点
if(v[index].size()==0){
// 统计该叶子结点
book[depth]++;
// 更新最大层次
maxDepth = max(maxDepth,depth);
return ;
}
// 递归调用
for(int i=0;i<v[index].size();i++){
dfs(v[index].at(i),depth+1);
}
}
int main(){
int N,M;
int node,K;
while(cin>>N>>M){
for(int i=0;i<M;i++){
cin>>node>>K;
for(int j=0;j<K;j++){
int temp;
cin>>temp;
v[node].push_back(temp);
}
}
// 从第一个结点开始,第零层
dfs(1,0);
cout<<book[0];
for(int i=1;i<=maxDepth;i++){
cout<<" "<<book[i];
}
}
return 0;
}