WA on #2 #4 #7 #10
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<bitset>
#include<queue>
#include<vector>
using namespace std;
#define rd(n) n=read()
#define ri register int
const int N=100002;
const int INF=1000000007;
inline int read()
{
register int ans=0,f=0;
register char c=getchar();
while(c<'0'||c>'9'){f^=(c=='-');c=getchar();}
while(c>='0'&&c<='9'){ans=(ans<<3)+(ans<<1)+(c^48);c=getchar();}
return f?-ans:ans;
}
inline void print(int n)
{
if(n<0){putchar('-');n=-n;}
if(n>9) print(n/10);
putchar(n%10+'0');
}
struct Graph{
int ver,head,Next,edge;
#define ver(i) g[i].ver
#define head(i) g[i].head
#define edge(i) g[i].edge
#define Next(i) g[i].Next
}g[N<<1];
int n,m,x,y,z,ans,tot,cnt,root,mi;
struct CutTree{
int siz,dep,fa;
#define siz(i) Tree[i].siz
#define dep(i) Tree[i].dep
#define fa(i) Tree[i].fa
}Tree[N];
inline void dfs1(int x,int father)
{
dep(x)=dep(father)+1;
fa(x)=father;
siz(x)=1;
for(ri i=head(x);i;i=Next(i))
{
ri y=ver(i);
if(y!=father)
{
fa(y)=x;
dfs1(y,x);
siz(x)+=siz(y);
}
}
}
inline int maxx(int a,int b){return a>b?a:b;}
inline int minn(int a,int b){return a<b?a:b;}
bitset<100005>v;
int dis[N];
inline void add(int x,int y,int z)
{
ver(++tot)=y;
edge(tot)=z;
Next(tot)=head(x);
head(x)=tot;
}
struct node{
int x,y;
bool operator<(const node &a)const{
return x<a.x;
}
};
int a[N];
priority_queue<node>q;
struct Node{
int sz,id,v;
bool operator<(const Node &a)const{
return sz>a.sz;
}
};
vector<Node>vt;
inline void dijkstra(int s)
{
v.reset();
for(ri i=1;i<=n;++i) dis[i]=INF;
dis[s]=0;
q.push((node){0,s});
while(!q.empty())
{
ri x=q.top().y;
q.pop();
if(v[x]) continue;
v[x]=1;
vt.clear();
for(ri i=head(x);i;i=Next(i))
{
ri y=ver(i),z=edge(i);
if(y==fa(x)) continue;
vt.push_back((Node){siz(y),y,z});
}
sort(vt.begin(),vt.end());
for(ri i=0;i<vt.size();++i)
{
ri y=vt[i].id,z=vt[i].v+i;
//if(y==fa(x)) cout<<i<<' '<<x<<' '<<y<<"sss\n";
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
q.push((node){-dis[y],y});
}
}
}
}
int b[N],c,rt;
inline void sub2()
{
print(n);
putchar('\n');
for(ri i=1;i<=n;++i)
{
print(i);
putchar(' ');
}
putchar('\n');
}
inline void sub3()
{
if(n&1)
{
print((n-1)/2+2);
putchar('\n');
print((n+1)/2-1);
putchar(' ');
print((n+1)/2);
putchar(' ');
print((n+1)/2+1);
putchar(' ');
}
else
{
print((n/2)+1);
putchar('\n');
print((n/2));
putchar(' ');
print((n/2)+1);
putchar(' ');
}
putchar('\n');
}
signed main(void)
{
rd(n);
for(ri i=2;i<=n;++i)
{
rd(x);
add(i,x,1);
add(x,i,1);
}
/*dfs1(1,0);
for(ri i=1;i<=n;++i)
{
b[++rt]=dep(i);
if(dep(i)==2) ++c;
}
sort(b+1,b+1+n);
bool fl=0;
for(ri i=1;i<=n;++i)
{
if(b[i]!=b[i-1]+1)
{
fl=1;
break;
}
}
if(!fl)
{
sub3();
return 0;
}
if(c==n-1)
{
sub2();
return 0;
}*/
//for(ri i=1;i<=n;++i) if(c[i]>=n-2&&n>2)
////////////
cnt=0; mi=INF;
for(ri i=1;i<=n;++i)
{
dfs1(i,0);
dijkstra(i);
ri res=-1;
for(ri j=1;j<=n;++j) res=maxx(res,dis[j]);
a[i]=res;
mi=minn(mi,res);
}
++mi;
print(mi);
putchar('\n');
for(ri i=1;i<=n;++i)
{
if(a[i]==mi)
{
print(i);
putchar(' ');
}
}
return 0;
}