A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 0, the number of nodes in a tree, and M (<), the number of non-leaf nodes. Then M lines follow, each in the format:
ID K ID[1] ID[2] ... ID[K]
where ID
is a two-digit number representing a given non-leaf node, K
is the number of its children, followed by a sequence of two-digit ID
‘s of its children. For the sake of simplicity, let us fix the root ID to be 01
.
The input ends with N being 0. That case must NOT be processed.
Output Specification:
For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.
The sample case represents a tree with only 2 nodes, where 01
is the root and 02
is its only child. Hence on the root 01
level, there is 0
leaf node; and on the next level, there is 1
leaf node. Then we should output 0 1
in a line.
Sample Input:
2 1
01 1 02
Sample Output:
0 1
数所有叶子节点的个数。先根据数据建树,然后dfs确定每个节点的深度并判断是否为叶节点。我的程序里最后又进行了一次bfs统计各个深度下的叶节点个数,其实可以直接在dfs过程中完成。
#include <iostream> #include <string> #include <map> #include <vector> #include <queue> #include <cstring> using namespace std; struct Node { int depth; vector<Node*> children; Node(int d):depth(d){}; }; map<int,Node*> nodes; int N,M,K; void bfs(Node* ptr,int maxdepth) { queue<Node*> q; q.push(ptr); int ans[maxdepth+1]; memset(ans,0,sizeof ans); int cnt=0; while(!q.empty()) { Node* tmp=q.front(); q.pop(); int sz=tmp->children.size(); if(sz==0) { cnt++; ans[tmp->depth]++; } for(int i=0;i<sz;i++) q.push(tmp->children[i]); } cout<<ans[0]; for(int i=1;i<=maxdepth;i++) cout<<‘ ‘<<ans[i]; cout<<endl; } int maxdepth=0; void dfs(Node* ptr,int depth) { if(ptr==NULL)return; maxdepth=max(depth,maxdepth); ptr->depth=depth; for(int i=0;i<ptr->children.size();i++) { dfs(ptr->children[i],depth+1); } } int main() { cin>>N>>M; if(N==0)return 0; if(M==0){cout<<N<<endl;return 0;} int tid,tid2; for(int i=0;i<M;i++) { cin>>tid>>K; if(nodes.find(tid)==nodes.end()) { nodes[tid]=new Node(0); } for(int j=0;j<K;j++) { cin>>tid2; if(nodes.find(tid2)==nodes.end()) { nodes[tid2]=new Node(0); } nodes[tid]->children.push_back(nodes[tid2]); } } dfs(nodes[1],0); bfs(nodes[1],maxdepth); return 0; }
原文地址:https://www.cnblogs.com/zest3k/p/11443995.html