#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,k;
vector<int> a[100001];
int cc[100001];
int bo[100001];
int c;
int d;
int vv[100001];
void dfs(int x,int s)
{
if(!a[x].size())
{
cc[c++]=s;
}
else
{
for(int i=0;i<a[x].size();i++)
{
if(bo[a[x][i]]==0)
{
bo[a[x][i]]=1;
dfs(a[x][i],s+1);
}
}
}
}
void df(int x,int s,int g)
{
if(!a[x].size())
{
if(s==g)
vv[d++]=x;
}
else
{
for(int i=0;i<a[x].size();i++)
{
if(bo[a[x][i]]==0)
{
bo[a[x][i]]=1;
df(a[x][i],s+1,g);
//bo[a[x][i]]=0;
}
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{ int x;
cin>>x;
if(x!=-1)
a[x].push_back(i);
else k=i;
}
bo[k]=1;
dfs(k,0);
sort(cc,cc+c);
cout<<cc[c-1]+1<<endl;
memset(bo,0,sizeof(bo));
bo[k]=1;
df(k,0,cc[c-1]);
//sort(vv,vv+d);
//cout<<vv[0];
//cout<<d;
for(int i=0;i<d;i++)
{
if(i==0) cout<<vv[i];
else cout<<" "<<vv[i];
}
// while(b.size())
// {
// int x=b.front();
// if(a[x].size())
// {
// for(int i=0; i<a[x].size(); i++)
// {
// b.push(a[x][i]);
// }
//
// }
// else
// {
// c++;
// }
// b.pop();
//
// }
}
/*泛舟沧海,立马昆仑*/
/*若你为了错过太阳而哭泣,那么你也将错过群星了*/
/*红了樱桃,绿了芭蕉*/
/*泛舟沧海,立马昆仑*/
/*若你为了错过太阳而哭泣,那么你也将错过群星了*/
/*红了樱桃,绿了芭蕉*/
/*
3 3
0 3
1 2
0 2
*/
PTA小辈分--dfs
最新推荐文章于 2024-10-15 19:28:18 发布
这篇文章介绍了如何使用C++编程语言实现图的深度优先搜索(DFS)和用于获取拓扑排序的函数。代码展示了如何处理邻接列表结构,以及对节点进行遍历的过程。
摘要由CSDN通过智能技术生成