#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 1e5 + 10;
int to[MAXN];
int sub[MAXN];
int p[MAXN];
int deg[MAXN], marc[MAXN];
vector<int> adj[MAXN], c[MAXN];
int n;
void dfs_1(int v, int p){
  sub[v] = 1;
  for(auto u : adj[v]){
    if(u != p){
      dfs_1(u, v);
      sub[v] += sub[u];
    }
  }
}
int get_centroid(int v, int p){
  for(auto u : adj[v]){
    if(u != p){
      if(sub[u] > n / 2) return get_centroid(u, v);
    }
  }
  return v;
}
void dfs_2(int v, int p, vector<int> &vtx){
  vtx.push_back(v);
  for(auto u : adj[v]){
    if(u != p){
      dfs_2(u, v, vtx);
    }
  }
}
int32_t main(){
  cin.tie(0)->sync_with_stdio(0);
  cin >> n;
  for(int i=1; i<n; i++){
    
    int a, b; cin >> a >> b;
    
    adj[a].push_back(b);
    adj[b].push_back(a);
    
    deg[a] ++; deg[b] ++;
  }
  
  // min: 
  
  queue<int> q;
  for(int i=1; i<=n; i++){
    if(deg[i] == 1){
      q.push(i);
    }
  }
  ll ans_min = 0;
  while(!q.empty()){
    int v = q.front();
    q.pop();
    if(!c[v].empty()){
      marc[v] = 1;
      int sz = (int) c[v].size();
      ans_min += 2 * sz;
      if(sz % 2 == 0){
        while(sz > 2){
          auto [a, b] = make_pair(c[v][sz - 2], c[v][sz - 1]);
          p[a] = b;
          p[b] = a;
          sz -= 2;
        }
        auto [a, b] = make_pair(c[v][0], c[v][1]);
        p[v] = a;
        p[b] = v;
        p[a] = b;
      } else{
        while(sz > 1){
          auto [a, b] = make_pair(c[v][sz - 2], c[v][sz - 1]);
          p[a] = b;
          p[b] = a;
          sz -= 2;
        }
        p[v] = c[v][0];
        p[c[v][0]] = v;
      }
    }
    for(auto u : adj[v]){
      deg[u] --;
      if(!marc[v]) c[u].push_back(v);
      if(deg[u] == 1) q.push(u);
    }
  }
  for(int i=1; i<=n; i++){
    if(p[i] == 0){
      p[i] = i;
      swap(p[i], p[adj[i][0]]);
      ans_min += 2;
    }
  }
  // max:
  
  dfs_1(1, 1);
  int c = get_centroid(1, 1);
  dfs_1(c, c);
  vector<pair<int, int>> to_add;
  for(auto u : adj[c]) to_add.push_back({sub[u], u});
  sort(to_add.rbegin(), to_add.rend());
  vector<int> vtx;
  for(auto [x, u] : to_add) dfs_2(u, c, vtx);
  vtx.push_back(c);
  int sz = (int) vtx.size();
  for(int i=0; i<sz; i++) vtx.push_back(vtx[i]);
  int k = to_add[0].first;
  for(int i=0; i<sz; i++) to[vtx[i]] = vtx[i + k];
  
  ll ans_max = 0;
  for(int i=1; i<=n; i++) ans_max += 2 * min(sub[i], n - sub[i]);
  cout << ans_min << " " << ans_max << "\n";
  for(int i=1; i<=n; i++) cout << p[i] << " ";
  cout << "\n";
  for(int i=1; i<=n; i++) cout << to[i] << " ";
  cout << "\n";
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |