1004. Counting Leaves

师兄的代码,学习了

孙佰贵的专栏 

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章