師兄的代碼,學習了
孫佰貴的專欄
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;
}