码迷,mamicode.com
首页 > 其他好文 > 详细

1004. Counting Leaves (30)

时间:2018-02-27 19:34:26      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:blog   leaves   vector   ems   queue   col   scan   pac   eve   

 

思路:

 

1.

先建树

比如利用 vector<vector<int>> v;

v[node].size() 即为叶子的判别条件

 

2.

利用bfs逐层判断节点是否为叶子节点,若是则level数组对应的位置加一

 

3.

求出深度并打印

 

#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;

vector<vector<int>> v;
int n,m;
queue<int> q;
int level[100];
int mh=0;

void bfs(int l) {  
  while(q.empty() != true) {
    int newnode=q.front();
    //pop并不会返回元素
    q.pop();
    if(v[newnode].size() == 0) {
      level[l]++;
      continue;
    }
    for(int i =0;i<v[newnode].size();i++) {
      q.push(v[newnode][i]);
      bfs(l+1);
    }
  }
}

int gethigh(int h,int node){
  if(v[node].size() == 0) mh=max(h,mh);
  for(int i =0;i<v[node].size();i++) {
    gethigh(h+1,v[node][i]);
  }
}

int main() {
  scanf("%d %d",&n,&m);
  v.resize(n+1);
  memset(level,0,100);
  //建树
  for(int i=0;i<m;i++) {
    int id,k;
    scanf("%d %d",&id,&k);

    for(int j =0;j<k;j++) {
      int ch;
      scanf("%d",&ch);
      v[id].push_back(ch);
    }
  }
  q.push(1);
  bfs(0);
  gethigh(0,1);
  //  printf("mh:%d\n",mh);
  for(int i=0;i<=mh;i++) {
    i == 0? printf("%d",level[i]):printf(" %d",level[i]);
  }
  return 0;
}

 

技术分享图片

 

1004. Counting Leaves (30)

标签:blog   leaves   vector   ems   queue   col   scan   pac   eve   

原文地址:https://www.cnblogs.com/tclan126/p/8480251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!