小字辈

it2023-12-22  66

本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。

简单并查集用广搜,可以利用vector动态数组

输入格式:

输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。

输出格式:

首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。

输入样例:

9

2 6 5 5 -1 5 6 4 7

输出样例:

4

1 9

#include <stdio.h> #include <string.h> #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; vector<int>vec[100001];//可以存二维的动态数组 int arr[100001]; int book[100001]; int main(void) { int m,k,a; int step,sum = 0,maxx = -1,flag = 0; queue<int>qu; cin >> m; for (int i = 1; i <= m; i++) { cin >> arr[i]; vec[arr[i]].push_back(i);//i是arr[i]的儿子 if (arr[i] == -1) { k = i;//找到最大辈分的编号 book[k] = 1; //将最大辈分的深度定位一,即其辈分为一 } } qu.push(k);//将最大辈分的编号入列 while (!qu.empty()) { step = qu.front(); sum++; for (int i = 0; i <vec[step].size() ; i++) { qu.push(vec[step][i]);//将编号为 step 的孩子 i 入列 book[vec[step][i]] = book[step] + 1;//其孩子辈分为父亲辈分加一 } qu.pop(); } for (int i = 1; i <= m; i++) maxx = max(book[i],maxx);//找到最大的辈分 cout << maxx << endl; for (int i = 1; i <= m; i++) { if (book[i] == maxx)//将辈分最小的编号输出 { if (flag)cout << " ";//输出格式需要注意 cout << i; flag = 1; } } return 0; }
最新回复(0)