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

L2-026 小字輩 (25 分)

space 一行 include out 格式 tin lan div it!

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

輸入格式:

輸入在第一行給出家族人口總數 N(不超過 100 000 的正整數) —— 簡單起見,我們把家族成員從 1 到 N 編號。隨後第二行給出 N 個編號,其中第 i 個編號對應第 i 位成員的父/母。家譜中輩分最高的老祖宗對應的父/母編號為 -1。一行中的數字間以空格分隔。

輸出格式:

首先輸出最小的輩分(老祖宗的輩分為 1,以下逐級遞增)。然後在第二行按遞增順序輸出輩分最小的成員的編號。編號間以一個空格分隔,行首尾不得有多余空格。

輸入樣例:

9
2 6 5 5 -1 5 6 4 7

輸出樣例:

4
1 9

主要思路:

將 i 的所有兒/女存入容器 v [ i ] 中,dfs,註意dfs內不能用叠代器訪問容器,只能用下標訪問。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v[100005],ans;//v[i]存入i的兒女編號,ans存入最小輩分編號 
vector<int>::iterator it;
int maxd;
void dfs(int n,int deep)
{
    int i;
    
for (i=0;i<v[n].size();i++) dfs(v[n][i],deep+1); if (deep>maxd) { maxd=deep; ans.clear(); ans.push_back(n); } else if (maxd==deep) ans.push_back(n); } int main() { int n,i,t,pos; cin>>n; for (i=1;i<=n;i++) { cin
>>t; if (t==-1) { pos=i; continue; } v[t].push_back(i); } dfs(pos,1); sort(ans.begin(),ans.end()); cout<<maxd<<endl; cout<<*ans.begin(); for (it=ans.begin()+1;it!=ans.end();it++) cout<< <<*it; cout<<endl; return 0; }

L2-026 小字輩 (25 分)