题意:
给了你一个家庭族谱,告诉你每个人的儿女分别是谁。
问哪一代人人数最多,并求出这一代人的数量。
思路:
并查集的核心在于并和查,但由于N仅仅为100,且族谱成树状关系,故无需使用并查集来求解,直接暴力即可。
用father[]确定每个人的父亲,通过每次向上搜 得知 自己是第几代, 以次方法遍历即可。
由于为N,最坏结果复杂度为N^2,而N仅为100,故直接利用该方法
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
#define INF 99999999
#define M 700
//start 20:22
//end 20:52
int main(){
int n,m,i,j,pid,cid,cn;
int pflag[200];
int father[200];
memset(pflag,0,sizeof(pflag));
memset(father,0,sizeof(father));
scanf("%d%d",&n,&m);
for(i = 0;i < m; i++)
{
scanf("%d%d",&pid, &cn);
for( j = 0 ;j < cn;j++)
{
scanf("%d",&cid);
father[cid] = pid;
}
}
int alevel[200];
int level,p;
memset(alevel,0,sizeof(alevel));
for(i = 1; i <= n; i++)
{
level = 1;
p = i;
while(father[p] != 0)
{
p = father[p];
level++;
}
alevel[level]++;
}
int maxnum = -1;
int maxlevel;
for(i =1 ;i<105;i++)
{
if(alevel[i] > maxnum)
{
maxnum = alevel[i];
maxlevel = i;
}
}
printf("%d %d\n",maxnum,maxlevel);
return 0;
}