师兄的代码,学习了
孙佰贵的专栏
1、组合类型,queue
2、bfs遍历
3、邻接表
4、注意事项:
①、先判断层,是否到了下一层。因为可能会到了下一层刚好是叶子,num++,再判断层,保存num,出错
②、退出while循环后,还有最后一层的叶子节点数没有保存。仍需要一个q.push();
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
queue< pair<int,int> > q; //组合类型,放入队列
vector<int> edge[200]; //边向量,模拟邻接表
vector<int> ans;
void bfs(int x) //广度遍历,按层查找叶节点
{
q.push(make_pair(x,0));
int cur_depth=0; //当前深度,若深度更深,说明到了下一层
int num=0; //当前层,叶节点个数
while (!q.empty())
{
int root=q.front().first;
int depth=q.front().second;
q.pop();
if (depth>cur_depth) //到了下一层,所以结果暂存
{
ans.push_back(num);
num=0; //临时变量恢复
cur_depth=depth; //深度变化
}
if (edge[root].size()==0) //相应邻接表空,
{
num++;
}
for (int j=0;j<edge[root].size();j++)
{
int b=edge[root][j];
q.push( make_pair(b,depth+1) );
}
}
ans.push_back(num); //对最后一层的最后一个节点处理
}
int main()
{
int n,m,i,j;
scanf("%d%d",&n,&m);
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
int id,k,child;
scanf("%d%d",&id,&k);
for (j=0;j<k;j++)
{
scanf("%d",&child);
edge[id].push_back(child);
}
}
bfs(1);
for (i=0;i<ans.size();i++)
{
if (i==0)
{
printf("%d",ans[i]);
}
else
printf(" %d",ans[i]);
}
return 0;
}