1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <bits/stdc++.h> #define N 100010 #define int long long using namespace std; int n, t; int u, x; vector <int> g[N]; int co[N], cnt; int v[N]; vector <int> coa[N]; void dfs1(int u, int v) { for (auto &i : g[u]) { if (i == v) continue; dfs1(i, u); } if (!co[u] && u != 1) { if (!co[v]) co[v] = co[u] = ++cnt; else co[u] = co[v]; } } int siz[N], zx = 1; int dep[N]; int arr[N], tot; void dfs2(int u, int v) { int mtr = 0; siz[u] = 1; for (auto &i : g[u]) { if (i == v) continue; dfs2(i, u); siz[u] += siz[i]; mtr = max(mtr, siz[i]); } mtr = max(mtr, n - siz[u]); if (mtr <= n / 2) zx = u; } void dfs3(int u, int v) { arr[tot++] = u; dep[u] = dep[v] + 1; for (auto &i : g[u]) { if (i == v) continue; dfs3(i, u); } } signed main() { freopen("home.in", "r", stdin); freopen("home.out", "w", stdout); scanf("%lld%lld", &n, &t); for (int i = 1; i < n; ++i) { scanf("%lld%lld", &u, &x); g[u].emplace_back(x); g[x].emplace_back(u); } if (t == 1) { dfs1(1, 0); if (!co[1]) co[1] = co[g[1][0]]; printf("%lld\n", (n - cnt) * 2); for (int i = 1; i <= n; ++i) coa[co[i]].emplace_back(i); for (int i = 1; i <= cnt; ++i) { for (int j = 0; j < coa[i].size(); ++j) { v[coa[i][j]] = coa[i][(j + 1) % coa[i].size()]; } } for (int i = 1; i <= n; ++i) printf("%lld ",v[i]); } else { dfs2(1, 0); dfs3(zx, 0); int ans = 0; for (int i = 1; i <= n; ++i) ans += dep[i] - 1; printf("%lld\n", ans * 2); for (int i = 0; i < n; ++i) v[arr[i]] = arr[(i + n / 2) % n]; for (int i = 1; i <= n; ++i) printf("%lld ", v[i]); } return 0; }
|