1056 Computer net #include<iostream> #include <stack> using namespace std; int n; int m,k; int a[10002][100]; int c[10002]; bool visit[10001]; int acount; int maxx; stack<int> vec; void init() { for (int i=0;i<=n;i++) { visit[i]=0; } acount=1; } void input() { cin>>n; for (int i=2;i<=n;i++) { int tmp; cin>>tmp; a[tmp][++c[tmp]]=i; a[i][++c[i]]=tmp; } } void bfs(int t) { visit[t]=1; for (int i=1;i<=c[t];i++) { int y=a[t][i]; if (visit[y]==0) { acount++; if (acount>maxx) { m=y; maxx=acount; } bfs(y); acount--; } } } bool backtrack(int t) { if (t==k) { return 1; } visit[t]=1; for (int i=1;i<=c[t];i++) { int y=a[t][i]; if (visit[y]==0) { vec.push(y); if(1==backtrack(y)) return 1; vec.pop(); } } return 0; } int main() { freopen("in.txt","r",stdin); input(); init(); maxx=0; bfs(1); init(); maxx=0; k=m; bfs(k); init(); vec.push(m); backtrack(m); if (maxx%2==0) { for (int i=1;i<maxx/2;i++) { vec.pop(); } int aa=vec.top(); vec.pop(); int bb=vec.top(); if (aa>bb) { swap(aa,bb); } cout<<aa<<" "<<bb; } else { for (int i=1;i<=maxx/2;i++) { vec.pop(); } cout<<vec.top(); } cout<<endl; return 0; }