描述:
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
思路:树的建立和BFS
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const ll maxx = 1e18; const int N = 1e5+100; const int p = 1e4+10; const double eps = 1e-8; struct node{ vector<int>ve;//放子节点 int len;//记录层数 }a[N],pp; int n,k,flag,max1;//flag记录根节点,max1记录最大层数 queue<node>qu; int b[N],cnt; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>k; a[k].ve.push_back(i); if(k==-1) flag=i; }//建树 a[flag].len=1; qu.push(a[flag]);//把根节点压入队列 while(!qu.empty()) { pp=qu.front(); qu.pop(); if(pp.ve.size()!=0) { int len=pp.ve.size(); for(int i=0;i<len;i++) { a[pp.ve[i]].len=pp.len+1; qu.push(a[pp.ve[i]]); } } }//BFS 处理所有成员的层数 for(int i=1;i<=n;i++) { max1=max(max1,a[i].len); }//找到最大层数 cout<<max1<<endl; for(int i=1;i<=n;i++) { if(a[i].len==max1) { b[++cnt]=i; } }//搜索记录所有最大层数的成员 for(int i=1;i<=cnt;i++) { if(i!=cnt) cout<<b[i]<<" "; else cout<<b[i]; }//按照格式输出 }