1094 The Largest Generation

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 tree (and hence assume that all 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:

1
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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:

1
9 4

浅析

Q:找树中最宽的那一层

Code

DFS

学习将层数放入递归函数参数这样的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include 
#include
using namespace std;

const int maxn=109;
int num[maxn] = {0}; //记录每一层的节点数
vector<int> v[maxn];
void dfs(int s,int level){
num[level]++;
for (int i = 0; i < v[s].size(); i++){
dfs(v[s][i], level + 1);
}
}

int main(){
int n, m;
cin >> n >> m;
for (int i=0; i < m;i++){
int a1, a2;
cin >> a1 >> a2;
for (int j = 0; j < a2;j++){
int b1;
cin >> b1;
v[a1].push_back(b1);
}
}
dfs(1, 1);
int max_n=0, max_l=0;
for (int i = 1;i <=n; i++){< span>
if(num[i]>max_n){
max_n = num[i];
max_l = i;
}
}
printf("%d %d\n",max_n,max_l);
return 0;
}

BFS

之前说 BFS 不知道入队的节点是哪一层,下面的方法完美打脸,感谢柳神!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include 
#include
#include
using namespace std;
const int maxn = 109;
int level[maxn]; //每个节点的层数
int num[maxn]{0}; //每层的结点数
vector<int> v[maxn];
int main(){
int n, m;
cin >> n >> m;
for (int i=0; i < m;i++){
int a1, a2;
cin >> a1 >> a2;
for (int j = 0; j < a2;j++){
int b1;
cin >> b1;
v[a1].push_back(b1);
}
}
queue<int> q;
q.push(1);
level[1] = 1;
while(!q.empty()){
int s = q.front();
q.pop();
num[level[s]]++;
for (int i = 0;i
q.push(v[s][i]);
level[v[s][i]] = level[s] + 1;
}
}
int max_n=0, max_l=0;
for (int i = 1;i <=n; i++){< span>
if(num[i]>max_n){
max_n = num[i];
max_l = i;
}
}
printf("%d %d\n",max_n,max_l);
return 0;
}
丨fengche丨 wechat
来找我聊天吧~
-------------本文结束感谢您的阅读-------------