Advertisement
Guest User

Untitled

a guest
Apr 26th, 2020
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int main() {
  6.   int n; cin >> n;
  7.   vector<vector<int>> graph(n);
  8.   vector<tuple<int, int, int>> edges;
  9.   for (int i = 1; i < n; ++i) {
  10.     int a, b, c; cin >> a >> b >> c;
  11.     graph[a - 1].push_back(b - 1);
  12.     graph[b - 1].push_back(a - 1);
  13.     edges.emplace_back(c, a - 1, b - 1);
  14.   }
  15.   long long ans = 0;
  16.  
  17.   sort(edges.begin(), edges.end());
  18.   int to_rem = 0;
  19.   vector<bool> still(n, true);
  20.   vector<int> tag(n, -1);
  21.   int at = 0;
  22.   int total_sz = n;
  23.   while (edges.size()) {
  24.     int c, a, b; tie(c, a, b) = edges.back(); edges.pop_back();
  25.     if (!still[a] || !still[b]) continue;
  26.  
  27.     ++at;
  28.     vector<int> nodes[2];
  29.     int rem[2] = {0, 0};
  30.     vector<tuple<int, int, int>> q;
  31.  
  32.     auto push = [&](int node, int b) {
  33.       if (!still[node]) return;
  34.       if (tag[node] == at) return;
  35.       tag[node] = at;
  36.       rem[b] += 1;
  37.       nodes[b].push_back(node);
  38.       q.emplace_back(b, node, 0);
  39.     };
  40.  
  41.     push(a, 0);
  42.     push(b, 1);
  43.  
  44.     for (int i = 0; rem[0] && rem[1]; ++i) {
  45.       int b, node, idx; tie(b, node, idx) = q[i];
  46.       if (idx < (int)graph[node].size()) {
  47.         push(graph[node][idx], b);
  48.         q.emplace_back(b, node, idx + 1);
  49.       } else {
  50.         rem[b] -= 1;
  51.       }
  52.     }
  53.    
  54.     if (nodes[1].size() < nodes[0].size())
  55.       swap(nodes[0], nodes[1]);
  56.     int left_sz = nodes[0].size();
  57.     int right_sz = total_sz - left_sz;
  58.    
  59.     if (left_sz + to_rem >= right_sz - 1) {
  60.       ans += (1LL * (total_sz - to_rem - 1)) << c;
  61.       break;
  62.     } else {
  63.       ans += (2LL * left_sz) << c;
  64.       to_rem += left_sz;
  65.       for (auto x : nodes[0]) {
  66.         still[x] = false;
  67.         total_sz -= 1;
  68.       }
  69.     }
  70.   }
  71.  
  72.   cout << ans << endl;
  73.   return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement