题目描述
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
考点
1.树;
2.遍历。
思路
1.我的思路(复杂)
一开始想到使用二维数组,但是觉得开二维数组建树浪费空间。于是考虑使用结构体数组。采用孩子-兄弟结点的形式存储树。因为一开始是乱序输入的,所以最后还需要从根结点开始,不断调整树。
2.柳神的思路
我写了大概一个半小时AC,然后一看柳神的直接开二维数组建树。我吐血了。
代码
1.我的代码(复杂版)
#include <iostream>
#include <vector>
using namespace std;
typedef struct node {
int val; //当前的值
int level; //当前的层数
int num; //当前层结点个数
struct node *subling;
int next;
}node;
vector<node> tree;
int n;
//递归调整
void generation(int r, int level) {
//结束条件
if (r == 0) {
return;
}
int f = r, first=0, s=0;
node *p = tree[f].subling, *q;
tree[f].level = level;
while (p!=NULL) {
int m = tree[p->val].next;
if (m != 0) {
first++;
//记录第一个非叶子结点
//将下一代所有结点都插入到这个结点的孩子结点
if (first == 1) {
s = m;
}
else {
q = tree[m].subling;
//头插法
//将当前结点的所有孩子结点插入到
//这一代的第一个非叶子结点的孩子结点
while (q != NULL) {
node *temp = q->subling;
q->subling = tree[s].subling;
tree[s].subling = q;
tree[m].subling = temp;
//调整每一层的个数
tree[s].num++;
tree[m].num--;
q = temp;
}
}
}
p = p->subling;
}
generation(s, level + 1);
}
void findMax() {
int i = 1, max=0, level;
for (; i <= n; i++) {
if (tree[i].num > max) {
max = tree[i].num;
level = tree[i].level;
}
}
cout << max << " " << level << endl;
}
int main() {
int i, j, m;
cin >> n >> m;
tree.resize(n+1);
for (i = 0; i < m; i++) {
int p, n, f;
cin >> p >> n;
tree[p].level = 0; tree[p].val = p;
for (j = 0; j < n; j++) {
int v; cin >> v;
if (j == 0) {
f = v;
tree[f].level = 0; tree[f].num = n; tree[f].val = f;
}
node *q = new node();
q->val = v; q->level = 0; q->num = n;
q->subling = tree[f].subling;
tree[f].subling = q;
}
tree[p].next = f;
}
if (m == 0) { tree[1].num = 1; tree[1].level = 1; }
generation(tree[1].next, 2);
findMax();
return 0;
}
2.柳神版(代码先贴上,我先去心痛一会了~~)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> v[100];
int book[100];
void dfs(int index, int level) {
book[level]++;
for(int i = 0; i < v[index].size(); i++)
dfs(v[index][i], level+1);
}
int main() {
int n, m, a, k, c;
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
scanf("%d %d",&a, &k);
for(int j = 0; j < k; j++) {
scanf("%d", &c);
v[a].push_back(c);
}
}
dfs(1, 1);
int maxnum = 0, maxlevel = 1;
for(int i = 1; i < 100; i++) {
if(book[i] > maxnum) {
maxnum = book[i];
maxlevel = i;
}
}
printf("%d %d", maxnum, maxlevel);
return 0;
}