A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.
Each input file contains one test case. Each case starts with a line containing 0<N<100, the number of nodes in a tree, and M (<N), 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.
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.
2 1
01 1 02
0 1
题意:
给一棵树,求这棵树中每一层中,没有子节点的节点个数。第一行输入两个数n,m;分别表示这棵树节点和叶子节点个数,第二行依次输入节点编号和这个节点子节点个数
题解:
用vector数组保存每个节点的儿子节点,然后用DFS依次遍历每个深度的每个节点,数组记录每层子节点数为0的节点即可
#include<iostream> #include<cstdio> #include<vector> #include<cstring> #define MAX 1000000 using namespace std; int num[1005],vis[10005]; vector<int>v[1005]; int cnt=0; void dfs(int root,int dep) { vis[root]=1; if(v[root].size()==0) { num[dep]++; cnt=cnt<dep?dep:cnt;//记录最大深度 } else { for(int i=0;i<v[root].size();i++)//遍历儿子节点 { if(vis[v[root][i]]==0) dfs(v[root][i],dep+1); } } } int main() { int n,m,id,k; cin>>n>>m; for(int i=0;i<m;i++) { cin>>id>>k; for(int i=0;i<k;i++) { int chi;//儿子节点 cin>>chi; v[id].push_back(chi); } } dfs(1,0); for(int i=0;i<=cnt;i++) { if(i==0) cout<<num[i]; else cout<<‘ ‘<<num[i]; } cout<<endl; return 0; }
1004 Counting Leaves (30分) DFS
原文:https://www.cnblogs.com/-citywall123/p/12095289.html