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 the tree (and hence assume that all the members are numbered from 01 to N), and M (

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 
#include 
using namespace std;
typedef struct node {
    int val;  //当前的值
    int level;  //当前的层数
    int num;   //当前层结点个数
    struct node *subling;
    int next;
}node;
vector 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 
#include 
using namespace std;
vector 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;
}

你可能感兴趣的:(1094.The Largest Generation)