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


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