//cre: johutha
//greedy idea on cf tutorial 
#include <iostream>
#include <vector>
#include <algorithm>
#define int int64_t
using namespace std;
struct graph
{
    int n;
    vector<vector<int>> adjlist;
    vector<int> pre;
    vector<int> subtc;
    int d = 0;
    void dfs(int curr, int par)
    {
        pre.emplace_back(curr);
        subtc[curr] = 1;
        for (auto next : adjlist[curr])
        {
            if (next == par) continue;
            dfs(next, curr);
            subtc[curr] += subtc[next];
            d += 2*min(subtc[next], n - subtc[next]);
        }
    }
    void solve()
    {
        subtc.resize(n, 0);
        dfs(0, -1);
        cout << d << "\n";
        vector<int> sol(n);
        for (int i = 0; i < n; i++)
        {
            sol[pre[(i + n/2) % n]] = pre[i];
        }
        for (auto i : sol)
        {
            cout << i + 1 << " ";
        }
        cout << "\n";
    }
};
signed main()
{
    int n;
    cin >> n;
    graph g;
    g.n = n;
    g.adjlist.resize(n);
    for (int i = 0; i < n - 1; i++)
    {
        int a, b;
        cin >> a >> b; a--; b--;
        g.adjlist[a].push_back(b);
        g.adjlist[b].push_back(a);
    }
    g.solve();
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |