#define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<cstring> #include<cmath> #include<string> #include<vector> #include<map> #include<iostream> #include<queue> #include<algorithm> using namespace std; struct Tree { vector<int> vec; }; void dealTree(int N, int i, vector<int>&pre,Tree* tree) { pre.push_back(i); bool *visit = new bool[N]; memset(visit, 0, sizeof(bool)*N); visit[i] = true; vector<int>next; while (pre.size() > 0) { next.clear(); for (int i = 0; i < pre.size(); i++) { for (int j = 0; j < tree[pre[i]].vec.size(); j++) if (!visit[tree[pre[i]].vec[j]]) { next.push_back(tree[pre[i]].vec[j]); visit[tree[pre[i]].vec[j]] = true; }
} if (next.size() == 0) break; pre = next; } } bool cmp(int a,int b) { return a<b; } int main() { int N = 0; cin >> N; Tree *tree = new Tree[N]; for (int i = 0; i < N - 1; i++) { int a, b; cin >> a >> b; tree[a - 1].vec.push_back(b - 1); tree[b - 1].vec.push_back(a - 1); }
int size = 0; bool *unvisit = new bool[N]; memset(unvisit, 1, N*sizeof(bool)); for (int i = 0; i < N; i++) { if (unvisit[i]) { size++; queue<int>q; q.push(i); unvisit[i] = 0; while (q.size()>0) { vector<int>tmp = tree[q.front()].vec; for (int j = 0; j < tmp.size(); j++) { if (unvisit[tmp[j]]) { q.push(tmp[j]); unvisit[tmp[j]] = 0; } } q.pop(); } } } if (size <2) { vector<int>pre; dealTree(N, 0, pre, tree); if (pre.size()>0) { vector<int>pre1; pre1.push_back(pre[0]); dealTree(N, pre[0], pre1, tree); for (int j = 0; j < pre1.size(); j++) pre.push_back(pre1[j]); } sort(pre.begin(), pre.end(), cmp); int iPre = pre[0]; cout << pre[0] + 1 << endl; for (int i = 1; i < pre.size(); i++) if (iPre!=pre[i]) { cout << pre[i] + 1 << endl; iPre = pre[i]; }