题目大意:
给出一个族谱,找出人数最多的一代,输出这代人的人数和代数编号。老祖宗代数编号为1,。
解题思路:
BFS遍历树赋值代数编号即可,当然DFS也可以,但是为了方便统计每一代人的人数还是用层次遍历更直观一些。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n,m;
struct node
{
int data,gen;
vector<int> child;
}nod[100];
void dfs()
{
int ma1=1,ma2=1,sum=1,g=1;
queue<int> q;
q.push(01);//根节点入队
while(!q.empty())
{
int t=q.front();
q.pop();
for(int i=0;i<nod[t].child.size();i++)
{
nod[nod[t].child[i]].gen=nod[t].gen+1;
q.push(nod[t].child[i]);
if(nod[nod[t].child[i]].gen==g)
{
sum++;
if(sum>ma1)//更新最多的一代人
{
ma1=sum;//人数
ma2=g;//代数
}
}
else
{
g=nod[nod[t].child[i]].gen;
sum=1;
}
}
}
printf("%d %d\n",ma1,ma2);
}
int main()
{
// std::ios::sync_with_stdio(false);
// cin.tie(0);
// freopen("test.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++)
{
int id,k;
scanf("%d %d",&id,&k);
for(int j=0;j<k;j++)
{
int tmp;
scanf("%d",&tmp);
nod[id].child.push_back(tmp);
}
}
nod[01].gen=1;
dfs();
return 0;
}