家庭层次结构通常由谱系树来表示,同一级别上的所有节点属于同一代。你的任务是找到人口最多的一代。
输入描述:
每个输入文件都包含一个测试用例。每个案例以两个正整数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;
}