L2-2 小字輩 (25 分)——2018
阿新 • • 發佈:2018-12-20
本題給定一個龐大家族的家譜,要請你給出最小一輩的名單。
輸入格式:
輸入在第一行給出家族人口總數 N(不超過 100 000 的正整數) —— 簡單起見,我們把家族成員從 1 到 N 編號。隨後第二行給出 N 個編號,其中第 i 個編號對應第 i 位成員的父/母。家譜中輩分最高的老祖宗對應的父/母編號為 -1。一行中的數字間以空格分隔。
輸出格式:
首先輸出最小的輩分(老祖宗的輩分為 1,以下逐級遞增)。然後在第二行按遞增順序輸出輩分最小的成員的編號。編號間以一個空格分隔,行首尾不得有多餘空格。
輸入樣例:
9
2 6 5 5 -1 5 6 4 7
輸出樣例:
4
1 9
#include<cstdio> #include<iostream> #include<set> #include<vector> using namespace std; const int maxn=1e5+10; int depth[maxn]; vector<int> v[maxn]; void dfs(int x,int d){ depth[x]=d; //printf("depth[%d]=%d\n",x,depth[x]); for(int i=0;i<v[x].size();i++){ dfs(v[x][i],d+1); } } int main(){ int n,root,tmp; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&tmp); if(tmp==-1) root=i; else{ v[tmp].push_back(i); } } dfs(root,1); int mx=-1; for(int i=1;i<=n;i++){ //printf("depth[%d]=%d\n",i,depth[i]); if(mx<depth[i]) mx=depth[i]; } printf("%d\n",mx); bool flag=false; for(int i=1;i<=n;i++){ if(depth[i]==mx){ if(flag) printf(" %d",i); else{ printf("%d",i); flag=true; } } } return 0; }