L2-2 小字輩 (25 分)

本題給定一個龐你們族的家譜,要請你給出最小一輩的名單。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 }
相關文章
相關標籤/搜索