L2-026 小字辈 (25分)
この質問は大家族の系図を与え、あなたに最年少世代のリストを与えるように頼みます。
入力形式:
最初の行に家族の総人口N(100 000を超えない正の整数)を入力します。簡単にするために、家族のメンバーに1からNまでの番号を付けます。次に、2行目にN個の番号が表示されます。ここで、i番目の番号はi番目のメンバーの親/母に対応します。家系図で最も世代が高い祖先は、親/母の番号-1に対応します。行の番号はスペースで区切られます。
出力形式:
最初に最小世代を出力します(祖先の世代は1に分割され、次の世代は徐々に増加します)。次に、2行目の成績が最も低いメンバーの番号を昇順で出力します。数字はスペースで区切られ、行の最初と最後に余分なスペースがあってはなりません。
入力サンプル:
9
2 6 5 5 -1 5 6 4 7
サンプル出力:
4
1 9
ACコード:
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
vector<int>v[100005];//存放结点
int root;//根节点
int L[100005]={
0};//根节点到每个结点的长度
void DFS(int node,int len){
//结点,当前深度
L[node] = len;
for(int i=0;i<v[node].size();i++){
DFS(v[node][i],len+1);
}
}
int main(int argc, char *argv[]) {
int n,a;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
if(a==-1){
root = i;
}else{
v[a].push_back(i);
}
}
DFS(root,1);//从根节点开始,长度为1遍历树
//找最大深度
int Max = -1;
for(int i=1;i<=n;i++){
if(L[i]>Max){
Max = L[i];
}
}
cout<<Max<<endl;
int flat = 1;
for(int i=1;i<=n;i++){
if(L[i]==Max){
if(flat){
cout<<i;
flat = 0;
}else{
cout<<" "<<i;
}
}
}
return 0;
}