外貿(mào)網(wǎng)站怎么注冊(cè)搜索引擎seo如何優(yōu)化
?
本題給定一個(gè)龐大家族的家譜,要請(qǐng)你給出最小一輩的名單。
輸入格式:
輸入在第一行給出家族人口總數(shù) N(不超過 100 000 的正整數(shù)) —— 簡(jiǎn)單起見,我們把家族成員從 1 到 N 編號(hào)。隨后第二行給出 N 個(gè)編號(hào),其中第 i 個(gè)編號(hào)對(duì)應(yīng)第 i 位成員的父/母。家譜中輩分最高的老祖宗對(duì)應(yīng)的父/母編號(hào)為 -1。一行中的數(shù)字間以空格分隔。
輸出格式:
首先輸出最小的輩分(老祖宗的輩分為 1,以下逐級(jí)遞增)。然后在第二行按遞增順序輸出輩分最小的成員的編號(hào)。編號(hào)間以一個(gè)空格分隔,行首尾不得有多余空格。
輸入樣例:
9
2 6 5 5 -1 5 6 4 7
輸出樣例:
4
1 9
#include <iostream>
#include <vector>
#include <set>
#include <string>
#include <iomanip>
#include <algorithm>
using namespace std;
#define M 100000
vector<int> v[M + 5];
int ans[M + 5], ind[M + 5];
void fun(int t, int i) {ans[t] = i;for (auto x : v[t]) {fun(x, i + 1);}return;
}
int main() {int n;cin >> n;int m;for (int i = 1, a; i <= n; i++) {cin >> a;if (a == -1) m = i;else v[a].push_back(i);}fun(m, 1);for (int i = 1; i <= n; i++) ind[i] = i;sort(ind + 1, ind + n + 1, [&](int i, int j)->bool {if (ans[i] != ans[j]) return ans[i] > ans[j];return i < j;});cout << ans[ind[1]] << endl;for (int i = 1; i <= n; i++) {if (ans[ind[i]] != ans[ind[1]]) break;if (i != 1) cout << " ";cout << ind[i];}return 0;
}