Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include "testlib.h"
- #include <bits/extc++.h>
- using namespace std;
- using namespace __gnu_pbds;
- template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- #define int long long
- #define YES(x) cout << (x?"YES\n":"NO\n")
- #define NO(x) cout << (x?"NO\n":"YES\n")
- #ifdef LO
- #pragma GCC optimize("trapv")
- #endif
- #ifndef LO
- #pragma GCC optimize("Ofast,unroll-loops")
- #endif
- //constexpr int MOD = (119<<23)+1;
- //constexpr int MOD = 967276608647009887ll;
- //constexpr int MOD = 1e9+7;
- constexpr int INF = 1e18;
- signed main() {
- #ifndef LO
- clog << "FIO\n";
- ios::sync_with_stdio(0);
- cin.tie(0);
- #endif
- cout << unitbuf;
- //#ifdef LO
- // cout << unitbuf;
- //#endif
- int n=22;
- auto go = [&] () -> void {
- vector<vector<int>> adj(n);
- vector<pair<int,int>> edges;
- for (int i = 1; i < n; i += 1) {
- // int u = i, v = gen[i];
- int u, v;
- cin >> u >> v;
- u -= 1, v -= 1;
- edges.push_back({v, u});
- adj[v].push_back(u);
- adj[u].push_back(v);
- }
- int mini = INF;
- int mini_i = -1;
- int mini_rt = -1;
- for (int i = 0; i < (1<<(n-1)); i += 1) {
- for (int rt = 0; rt == 0; rt += 1) {
- vector<bool> heavy(n-1);
- vector<vector<pair<bool,int>>> wadj(n);
- for (int j = 0; j < n-1; j += 1) {
- wadj[edges[j].first].push_back({bool((1<<j)&i), edges[j].second});
- wadj[edges[j].second].push_back({bool((1<<j)&i), edges[j].first});
- }
- vector<int> head(n, -INF), end(n, -INF);
- vector<int> par(n, -INF);
- vector<int> d(n, -INF);
- auto dfs = [&] (auto f, int u, int hd) -> void {
- if (hd == -1) {
- hd = u;
- head[u] = u;
- }
- end[u] = u;
- bool leaf = true;
- int cnt = 0;
- for (const auto &[w, x] : wadj[u]) {
- leaf &= x == par[u];
- cnt += x != par[u] && w;
- }
- for (const auto &[w, x] : wadj[u]) {
- if (x != par[u]) {
- d[x] = d[u]+1;
- par[x] = u;
- if (w && cnt == 1) {
- head[x] = head[u];
- f(f, x, u);
- end[u] = end[x];
- } else {
- f(f, x, -1);
- }
- }
- }
- };
- dfs(dfs, rt, -1);
- int metric = 0;
- for (int j = 0; j < n; j += 1) {
- int tot = 1;
- int x = j;
- while (x != rt) {
- if (head[x] != x) {
- if (end[x] == x) {
- tot += 1;
- } else {
- tot += min(__lg(d[end[x]]-d[head[x]]+1-1)+2, d[x]-d[head[x]]+1);
- }
- x = head[x];
- if (x != rt) {
- x = par[x];
- } else {
- tot -= 1;
- break;
- }
- } else {
- x = par[x];
- tot += 1;
- }
- }
- metric = max(metric, tot);
- }
- if (metric < mini) {
- mini_i = i;
- mini_rt = rt;
- mini = metric;
- }
- }
- }
- for (auto &[u, v] : edges) {
- cout << u+1 << " " << v+1 << "\n";
- }
- cout << "\n";
- for (int i = 0; i < n-1; i += 1) {
- if (mini_i&(1<<i)) {
- cout << edges[i].first+1 << " " << edges[i].second+1 << "\n";
- }
- }
- cout << mini_i << " " << mini_rt << " = heavy edges, root\n";
- cout << mini << "!\n";
- cout << "==================================\n";
- };
- go();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement