本題給定一個龐你們族的家譜,要請你給出最小一輩的名單。ios
輸入在第一行給出家族人口總數 N(不超過 100 000 的正整數) —— 簡單起見,咱們把家族成員從 1 到 N 編號。隨後第二行給出 N 個編號,其中第 i 個編號對應第 i 位成員的父/母。家譜中輩分最高的老祖宗對應的父/母編號爲 -1。一行中的數字間以空格分隔。spa
首先輸出最小的輩分(老祖宗的輩分爲 1,如下逐級遞增)。而後在第二行按遞增順序輸出輩分最小的成員的編號。編號間以一個空格分隔,行首尾不得有多餘空格。code
9 2 6 5 5 -1 5 6 4 7
4 1 9
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #define ll long long 5 using namespace std; 6 const int amn=1e5+5; 7 int a[amn]; 8 struct mem 9 { 10 int fa,rank; 11 }m[amn]; 12 int z; 13 int fi(int x) 14 { 15 if(m[x].rank)return m[x].rank; 16 return m[x].rank=fi(m[x].fa)+1; 17 } 18 int main() 19 { 20 int n,in; 21 while(cin>>n) 22 { 23 for(int i=1;i<=n;i++) 24 { 25 m[i].rank=m[i].fa=0; 26 } 27 for(int i=1;i<=n;i++) 28 { 29 cin>>in; 30 m[i].fa=in; 31 if(in==-1) 32 { 33 z=in; 34 m[i].rank=1; 35 } 36 } 37 int maxn=0; 38 for(int i=1;i<=n;i++) 39 { 40 if(i!=z) 41 fi(i); 42 if(m[i].rank>maxn)maxn=m[i].rank; 43 } 44 int top=0; 45 for(int i=1;i<=n;i++) 46 { 47 if(m[i].rank==maxn)a[top++]=i; 48 } 49 sort(a,a+top); 50 cout<<maxn<<endl; 51 for(int i=0;i<top;i++) 52 { 53 cout<<a[i]; 54 if(i<top-1)cout<<" "; 55 else cout<<endl; 56 } 57 } 58 }