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
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
思路:其实dfs写起来真的很短很舒服,但是自从上一次栈溢出以后就养成了一个bfs、dfs都可以过就先写bfs的习惯。现在看来这个习惯不是很好,如果先看一下深度,不难发现dfs肯定能过,然后就可以写一个短一点的程序节省一下考试的时间。
#include<bits/stdc++.h>
using namespace std;
struct node{
int n;
vector<int> v;
};
node t[110];
int n,m;
struct que{
int lab, lev;
que(int a,int b):lab(a),lev(b){}
que(){}
};
int main(){
int lab,num;
scanf("%d %d", &n, &m);
for(int i=0;i<m;++i){
scanf("%d %d", &lab, &num);
t[lab].v.resize(num);
for(int j=0;j<num;++j)
scanf("%d", &t[lab].v[j]);
}
int rt = 1;
queue<que> q;
q.push(que(rt, 1));
int maxx = 0, maxl, lev=1, cnt=0;
que now;
while(!q.empty()){
now = q.front();
q.pop();
if(lev==now.lev) cnt++;
else {
if(cnt>maxx){
maxx=cnt;
maxl=lev;
}
cnt=1;
lev++;
}
int len = t[now.lab].v.size();
for(int i=0;i<len;++i)
q.push(que(t[now.lab].v[i], now.lev+1));
}
if(cnt>maxx){
maxx=cnt;
maxl=lev;
}
cout<<maxx<<" "<<maxl<<endl;
return 0;
}