1094 The Largest Generation (25 分)
A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level belong to the same generation. Your task is to find the generation with the largest population.
Input Specification
Each input file contains one test case. Each case starts with two positive integers N (<100) which is the total number of family members in the tree (and hence assume that all the members are numbered from 01 to N), and M (<N) which is the number of family members who have children. Then M lines follow, each contains the information of a family member in the following format:
ID K ID[1] ID[2] ... ID[K]
where ID is a two-digit number representing a family member, K (>0) is the number of his/her children, followed by a sequence of two-digit ID’s of his/her children. For the sake of simplicity, let us fix the root ID to be 01. All the numbers in a line are separated by a space.
Output Specification
For each test case, print in one line the largest population number and the level of the corresponding generation. It is assumed that such a generation is unique, and the root level is defined to be 1.
Sample Input
23 13
21 1 23
01 4 03 02 04 05
03 3 06 07 08
06 2 12 13
13 1 21
08 2 15 16
02 2 09 10
11 2 19 20
17 1 22
05 1 11
07 1 14
09 1 17
10 1 18
Sample Output
9 4
题意
层序遍历,找出结点数最大的层,输出其结点数和层号。
代码
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
struct node {
int layer;
vector<int> child;
} Node[100];
int n,m,maxlayer,id,t,lg=-1,pos=0; //lg为最大人口数,pos为对应层号
vector<int> v[100];
void layOrder(int root) {
queue<int> q;
q.push(root);
Node[root].layer=1;
v[Node[root].layer].push_back(root);
while(!q.empty()) {
int now=q.front();
q.pop();
maxlayer = max(Node[now].layer,maxlayer);
for(int i=0; i<Node[now].child.size(); i++) {
int child=Node[now].child[i];
Node[child].layer=Node[now].layer+1;
v[Node[child].layer].push_back(child);
q.push(child);
}
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++) {
scanf("%d%d",&id,&t);
Node[id].child.resize(t);
for(int j=0; j<t; j++) {
scanf("%d",&Node[id].child[j]);
}
}
layOrder(1);
for(int i=1; i<=maxlayer; i++) {
int tmp=v[i].size();
if(tmp > lg) {
lg = tmp;
pos = i;
}
}
printf("%d %d",lg,pos);
return 0;
}