L2-026 小字辈 (25 分)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
输出样例:
程序源代码:
邻接表建树+BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
   | #include <bits/stdc++.h> using namespace std; vector<int> tree[100005];				 int deeptree[100005];					 int n; int root;								 int bfs(){								     queue<int> q;     q.push(root);						     int x;								     while(!q.empty()){         x=q.front();         q.pop();         for (int i = 0; i <tree[x].size() ; ++i) {             deeptree[tree[x][i]]=deeptree[x]+1;						             q.push(tree[x][i]);
          }     }     return deeptree[x];				 } int main() {     n;     cin>>n;     int a[n];     for (int i = 1; i <=n ; ++i) {         cin>>a[i];         if(a[i]==-1){             root=i;				         }     }     for (int j = 1; j <=n ; ++j) {					         tree[a[j]].push_back(j);					         if(a[j]==-1) deeptree[j]=1;					     }     int ans=bfs();     cout<<ans<<endl;     int maxdeepcnt=0;								     int tmp[n];										     for (int k = 1; k <=n ; ++k) {					         if(ans==deeptree[k]){             maxdeepcnt++;             tmp[maxdeepcnt]=k;         }     }          for (int l = 1; l <=maxdeepcnt ; ++l) {         if(l!=maxdeepcnt) cout<<tmp[l]<<" ";         else cout<<tmp[l]<<endl;     }     return 0; }
 
  | 
参考资料
题目详情 - L2-026 小字辈 (25 分) (pintia.cn)