1. 程式人生 > >L2-2 小字輩 (25 分)——2018

L2-2 小字輩 (25 分)——2018

本題給定一個龐大家族的家譜,要請你給出最小一輩的名單。

輸入格式:

輸入在第一行給出家族人口總數 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;
}