题目要求出树每层的叶子节点。经典的数据结构题目,利用bfs可以逐步求出。
// 1004. Counting Leaves.cpp: 主项目文件。 #include "stdafx.h" #include <cstdio> #include <cstring> #include <vector> #include <queue> using namespace std; const int N=103; typedef struct Node{ int data,level; }Node; vector<Node> edge[N]; bool used[N]; queue<Node> Q; void bfs(){ int tLevel=1,tSum=0; while(!Q.empty()){ Node temp=Q.front(); int dataTemp=temp.data,levelTemp=temp.level; if(levelTemp==tLevel){ if(edge[dataTemp].size()==0) tSum++; } else{ printf("%d ",tSum); if(edge[dataTemp].size()==0) tSum=1; else tSum=0; tLevel=levelTemp; } Q.pop(); for(vector<Node>::iterator ite=edge[dataTemp].begin(); ite!=edge[dataTemp].end();ite++){ if(!used[ite->data]){ ite->level=levelTemp+1; Q.push(*ite); used[ite->data]=true; } } } printf("%d\n",tSum); } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ for(int i=0;i<N;i++) edge[i].clear(); for(int i=0;i<m;i++){ int id,num; scanf("%d%d",&id,&num); for(int i=0;i<num;i++){ int temp; scanf("%d",&temp); Node node; node.data=temp,node.level=0; edge[id].push_back(node); } } Node node; node.data=1,node.level=1; while(!Q.empty()) Q.pop(); Q.push(node); memset(used,0,sizeof(used)); used[1]=true; bfs(); } return 0; }