这道题是真心简单,天梯选拔赛曾经做过,没做出来,因为当时还没有学数据结构里的图,现在才发现,这道题其实就是一个图题(有向图),只是稍微变了一下图中输入的方式而已。这里我就不再解释为什么是图了,相信提示到这里大家应该能想起来了,就是一个连通有向图,并且从祖宗出发能够遍历到所有节点。
以下给出代码。
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
vector<int> G[100005];
set<int> sc;
int f[100005];
int level[100005];
int inq[100005];
int zu,max1;
void bfs(int s)
{
queue<int> q;
q.push(s);
inq[s]=true;
while(!q.empty())
{
int t=q.front();q.pop();
if(level[t]>max1)
{
max1=level[t];
sc.clear();
sc.insert(t);
}
else if(level[t]==max1)
sc.insert(t);
for(int i=0;i<G[t].size();i++)
{
int u=G[t][i];
if(inq[u]==false)
{
inq[u]=true;
q.push(u);
level[u]=level[t]+1;
}
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0,a;i<n;i++)
{
scanf("%d",&a);
if(a!=-1)
G[a].push_back(i+1);
else
zu=i+1;
}
level[zu]=1;
bfs(zu);
cout<<max1<<endl;
set<int>::iterator it;
for(it=sc.begin();it!=sc.end();it++)
{
if(it!=sc.begin())
cout<<' ';
cout<<(*it);
}
}