当前位置: 代码迷 >> 综合 >> The Largest Generation
  详细解决方案

The Largest Generation

热度:72   发布时间:2024-01-10 04:21:08.0

家庭层次结构通常由谱系树来表示,同一级别上的所有节点属于同一代。你的任务是找到人口最多的一代。

输入描述:
每个输入文件都包含一个测试用例。每个案例以两个正整数N(<100)开始,M(<N)是树中所有家庭成员的总数(因此假设所有成员都从01到N编号)有孩子的家庭成员。然后是M行,每行包含以下格式的家庭成员的信息:ID K ID [1] ID [2] ... ID [K] 其中ID是代表家庭成员的两位数字,K( > 0)是他/她的孩子的数量,然后是他/她的孩子的一系列两位数的ID。为了简单起见,让我们修复根ID为01.一行中的所有数字都被一个空格分开。


输出描述:
对于每个测试用例,在一行中打印出最大的人口数量和相应代的水平。假定这样一代是唯一的,并且根级被定义为1。
示例1

输入

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

输出

9 4

这个方法没有用到树的结构,后面会写一篇用树解决这题的方法。

思路:用一个数组f[]记录子代的父亲,f[4]=3,表示4的父节点是3,一次类推

     再用一个d[]记录元素x是第几代。d[1]=1,其他的节点利用getd()函数来计算

     自己处于第几代。

#include <cstdio>
#include <cstring>
#include <string>
#include<iostream>
using namespace std;int f[105]={0};
int d[105] = {0,1};
int num[105] = {0, 1};
int getd(int i) {return d[i]?d[i]:(d[i] = getd(f[i]) + 1);
}
int main() {
int n, m;for (scanf("%d%d", &n,&m);m;--m) {int x, i;scanf("%d%d",&x,&i);for (x; i; --i) {int y;scanf("%d", &y);f[y] = x;}}m = 1;for (int i = 1; i <=n; ++i) {int temp = getd(i);if (++num[temp] > num[m]) {m = temp;}}printf("%d %d\n", num[m], m);return 0;
}


  相关解决方案