本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
9 2 6 5 5 -1 5 6 4 7
讯享网
输出样例:
讯享网4 1 9
深度优先搜索的题目,因为是求树的高度和最深的所有叶子结点,感觉深搜的题目做多了确实再做的时候就有心得了,以下是解析
先画出家族谱:

注意,这里我在存储邻接表的时候是把所有的编号都-1了,从0开始存的,别忘了最后再把1加回来
每次进行递归搜索,遇到更深的高度就更新,并且将vv数组清空(因为每次更新都意味着不是最深的节点),然后当深度与当前最深节点相同时,存入数组
#include<iostream> #include<string> #include<algorithm> #include<bits/stdc++.h> #include<stack> #include<set> #include<vector> #include<map> #include<queue> #include<deque> #include<cctype> #include<unordered_set> #include<unordered_map> #include<fstream> using namespace std; const int maxn=; vector<int>v[maxn]; int n; int depth; int maxdepth=-1; vector<int>temp;//这俩没啥用,为了显示路径判断递归正确性的,不过有的题 vector<int>vis;//有的题需要求出最短路径就需要这两个数组 vector<int>vv; int t=0; void Dfs(int x,int d){
if(d>maxdepth){
//如果深度更深,就更新,同时将vv数组清空 maxdepth=d; vv.clear(); } if(d==maxdepth){
//等于当前最深高度,直接放入数组即可 vv.push_back(x); } for(int i=0;i<v[x].size();i++){
//每次像更深的地方递归,并且将深度加1 Dfs(v[x][i],d+1); } } int main(){
cin>>n; for(int i=0;i<n;i++){
int x; cin>>x; if(x==-1) t=i; else v[x-1].push_back(i);//构建邻接表 } temp.push_back(t);//别忘了将祖宗 Dfs(t,1); cout<<maxdepth<<endl; for(int i=0;i<vv.size();i++){
if(!i) cout<<vv[i]+1; else cout<<" "<<vv[i]+1; } return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/64518.html