#include #include #include #include #include using namespace std; #define MAXN 40000 struct EDGE { int From; int To; }; int To[MAXN]; int Degree[MAXN]; int CurIndex[MAXN]; int Fol[MAXN]; int iFol[MAXN]; EDGE Edge[MAXN]; int Time[MAXN]; int Comp[MAXN]; int time; int n; int m; int Q[MAXN]; int QBeg, QEnd; int nComps; struct COMP { int n; set Set; int operator < (const COMP& C) const { return n < C.n; } }; COMP CompSet[MAXN]; int Check(int v) { //printf("Cutting at %d\n", v); nComps = 0; time++; Time[v] = time; Comp[v] = 0; for(int i = 0; i < n; i++) { if(i == v) { continue; } if(Time[i] == time) { continue; } //printf("Starting component from %d\n", i); QBeg = 0; QEnd = 0; Q[QEnd++] = i; Time[i] = time; Comp[i] = ++nComps; while(QBeg < QEnd) { int cur = Q[QBeg++]; for(int j = iFol[cur]; j < iFol[cur + 1]; j++) { int t = Fol[j]; //printf("Edge %d->%d", cur, t); if(Time[t] != time) { //printf(" is new\n"); Time[t] = time; Comp[t] = nComps; Q[QEnd++] = t; } else { //printf("\n"); } } } //printf("Size is %d\n", QEnd); if(QEnd * 2 > n) { return 0; } } return 1; } int main() { while(scanf("%d", &n) > 0) { memset(Degree, 0, sizeof(Degree)); memset(CurIndex, 0, sizeof(CurIndex)); m = n - 1; for(int i = 0; i < m; i++) { scanf("%d", To + i); Edge[i * 2] = (EDGE) {i + 1, To[i]}; Edge[(i * 2) + 1] = (EDGE) {To[i], i + 1}; Degree[i + 1]++; Degree[To[i]]++; } m *= 2; for(int i = 0; i < n; i++) { iFol[i + 1] = iFol[i] + Degree[i]; CurIndex[i] = iFol[i]; } for(int i = 0; i < m; i++) { int f = Edge[i].From; int t = Edge[i].To; Fol[CurIndex[f]++] = t; } /*for(int i = 0; i < n; i++) { printf("Followers of %d: ", i); for(int j = iFol[i]; j < iFol[i + 1]; j++) { int t = Fol[j]; printf("%d ", t); } printf("\n"); }*/ int v; for(v = 0; v < n; v++) { if(Check(v)) { break; } } if(v == n) { printf("!!!\n"); for(;;); } //printf("1\n"); for(int i = 0; i < nComps; i++) { CompSet[i].n = 0; CompSet[i].Set.clear(); } //printf("2\n"); for(int i = 0; i < n; i++) { int c = Comp[i]; if(c) { c--; CompSet[c].n++; CompSet[c].Set.insert(i); } } //printf("3\n"); printf("%d", v); int prev = -1; for(int i = 1; i < n; i++) { //printf("i: %d\n", i); int max = 0; int maxj = -1; for(int j = 0; j < nComps; j++) { if(j == prev) { continue; } if(CompSet[j].n > max) { max = CompSet[j].n; maxj = j; } } if(maxj == -1) { printf("!\n"); for(;;); } set& Set = CompSet[maxj].Set; printf(" %d", *(Set.begin())); Set.erase(Set.begin()); CompSet[maxj].n--; prev = maxj; } printf("\n"); } return 0; }