家系世系通常以族谱树表示,同一层的所有节点属于同一代。你的任务是找出人口最多的一代。
输入格式:
每个输入文件包含一个测试用例。每个测试用例首先包含两个正整数 NN(家族成员总数,<100<100,成员编号从 01 到 NN)和 MM(有子女的成员数,<N<N)。接下来 MM 行,每行给出一位成员及其子女信息,格式为:
ID K ID[1] ID[2] ... ID[K]
其中 ID 为两位数字,表示成员编号;KK(>0>0)为子女数,后跟 KK 个两位数字的子女编号。为简化起见,根节点编号固定为 01。行内数字用空格分隔。
输出格式:
对于每个测试用例,输出一行,包括人口最多的世代人口数和该世代的层次编号。假设该世代唯一,根节点所在层次编号为 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
cpp
#include <iostream>
#include <bits/stdc++.h>
#include <cstring>
#include <iomanip>
using namespace std;
int main(){
ios::sync_with_stdio(0); //加速
cin.tie(0);
cout.tie(0);
int n,m;cin>>n>>m;
map<string,vector<string>> mp;
for(int i=0;i<m;++i){
string id;int k;cin>>id>>k;
for(int j=0;j<k;++j){
string u;cin>>u;
mp[id].push_back(u);
}
}
if(n==1){
cout<<1<<" "<<1<<endl;
return 0;
}
string root="01";
queue<string> q;
q.push(root);
int maxx=0;
vector<int> ans;
int high=0;
int h=0;
ans.push_back(1);
while(!q.empty()){
int sum=0;
int len=q.size();
for(int i=0;i<len;++i){
string t=q.front();
q.pop();
sum+=mp[t].size();
for(string x:mp[t]){
q.push(x);
}
}
if(sum>0){
ans.push_back(sum);
if(sum>maxx)maxx=sum;
}
}
int pos=-1;
for(int i=0;i<ans.size();++i){
if(ans[i]==maxx){
pos=i+1;break;;
}
}
cout<<maxx<<" "<<pos<<endl;
return 0;
}