1094. The Largest Generation

来源:互联网 发布:演员知乎 编辑:程序博客网 时间:2024/05/12 05:34

题目

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.用BFS或DFS实现都可以,都要先在全局定义一个hashTable[maxn],hashTable[i]记录第i层的结点个数。

DFS版代码
#include<cstdio>#include<vector>using namespace std;const int maxn = 110;struct node{    vector<int> child;}Node[maxn]; int n,m;//结点个数,非叶结点的个数 int hashTable[maxn] = { 0 };//hashTable[i] 表示第 i层的结点个数 void DFS(int index,int level){    hashTable[level]++;     for(int i=0;i<Node[index].child.size();i++){        DFS(Node[index].child[i],level+1);    }} int main(){    scanf("%d%d",&n,&m);    int father,k,child;//父亲结点,孩子个数,孩子结点     for(int i=0;i<m;i++){//输入结点信息         scanf("%d%d",&father,&k);        for(int i=0;i<k;i++){            scanf("%d",&child);            Node[father].child.push_back(child);        }    }    DFS(1,1);//根结点编号为01,定义为第1层    int maxNum = -1,maxLevel;    for(int i=1;i<=maxn;i++){        if(hashTable[i] > maxNum){            maxNum = hashTable[i];            maxLevel = i;        }    }     printf("%d %d\n",maxNum,maxLevel);    return 0;} 
BFS版代码
#include<cstdio>#include<queue>#include<vector>using namespace std;const int maxn = 110;struct node{    int layer;    vector<int> child;}Node[maxn]; int n,m;//结点个数,非叶结点的个数 int hashTable[maxn] = { 0 };//hashTable[i] 表示第 i层的结点个数 void BFS(int root){    queue<int> q;    q.push(root);    Node[root].layer = 1;    while(!q.empty()){        int top = q.front();        q.pop();        hashTable[Node[top].layer]++;        for(int i=0;i<Node[top].child.size();i++){            int kid = Node[top].child[i];            q.push(kid);            Node[kid].layer = Node[top].layer + 1;        }    }   }int main(){    scanf("%d%d",&n,&m);    int father,k,child;//父亲结点,孩子个数,孩子结点     for(int i=0;i<m;i++){//输入结点信息         scanf("%d%d",&father,&k);        for(int i=0;i<k;i++){            scanf("%d",&child);            Node[father].child.push_back(child);        }    }    BFS(1);//根结点编号为01    int maxNum = -1,maxLevel;    for(int i=1;i<=maxn;i++){        if(hashTable[i] > maxNum){            maxNum = hashTable[i];            maxLevel = i;        }    }     printf("%d %d\n",maxNum,maxLevel);    return 0;} 
0 0
原创粉丝点击