www.pudn.com > SORT.rar > toj1743.cpp
/* TOJ 1743 King's Treasure * 16 2006-05-11 18:12:08 1.5K 00:00.95 12924K C++ RoBa_Test */ #include#include #include using namespace std; const int MAXN = 240010; struct Q {int id,step,fa;} q[MAXN]; vector a[MAXN]; int tk[MAXN],ans[MAXN]; int main() { int cases,n,i,t,head,tail,src,pans; scanf("%d",&cases); while (cases--) { scanf("%d",&n); for (i = 1 ; i <= n ; i++) a[i].clear(); for (i = 2 ; i <= n ; i++) { scanf("%d",&t); a[i].push_back(t); a[t].push_back(i); } memset(tk,0,sizeof(tk)); head = 0; tail = 1; tk[1] = 1; q[head].id = 1; q[head].step = 0; while (head < tail) { for (i = 0 ; i < a[q[head].id].size() ; i++) if (tk[a[q[head].id][i]] == 0) { q[tail].id = a[q[head].id][i]; q[tail++].step = q[head].step + 1; tk[a[q[head].id][i]] = 1; } ++head; } src = q[tail-1].id; memset(tk,0,sizeof(tk)); head = 0; tail = 1; tk[src] = 1; q[head].id = src; q[head].step = 0; q[head].fa = -1; while (head < tail) { for (i = 0 ; i < a[q[head].id].size() ; i++) if (tk[a[q[head].id][i]] == 0) { q[tail].id = a[q[head].id][i]; q[tail].fa = head; q[tail++].step = q[head].step + 1; tk[a[q[head].id][i]] = 1; } ++head; } pans = 0; --head; while (head != -1) { ans[pans++] = q[head].id; head = q[head].fa; } if (pans % 2 == 0) printf("%d %d\n",min(ans[pans/2-1],ans[pans/2]), max(ans[pans/2-1],ans[pans/2])); else printf("%d\n",ans[pans/2]); } return 0; }