本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
输出样例:
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
| #include<iostream> #include<queue> #include<vector> using namespace std; vector <int>v[200005]; int vv[100005]; queue<int > q; int main(void) { int n; int base;//祖宗的编号 cin >> n; int t; for (int i = 1; i <= n; i++) { cin >> t; if (t == -1) base = i; else { v[t].push_back(i);//儿子添加到父亲的那一维数组 t为父亲 i为儿子的编号 } } q.push(base); int beifen = 1;//老祖宗辈分为1 vv[base] = 1;//每个人的备份 while (!q.empty()) { int temp = q.front();//取出当前最大辈中的一个人 进行深度遍历 q.pop(); int num = v[temp].size();//父亲的儿子的个数 for (int i = 0; i < num; i++) { vv[v[temp][i]] = vv[temp] + 1;//父亲比儿子大一辈,数字上比儿子小 1 儿子的辈分为父亲的辈分+1 beifen = max(beifen, vv[v[temp][i]]);//查看当前辈分 q.push(v[temp][i]);//将儿子放进队列,进行循环 } } cout << beifen << endl; int flag = 0; for (int i = 1; i <= n; i++) { if (vv[i] == beifen) { if (!flag) { cout << i; flag = 1; } else { cout <<" " <<i; } } } cout << endl; return 0; }
|