Advertisement
999ms

Untitled

Apr 26th, 2020
490
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #pragma GCC Optimaze("Ofast")
  2. #pragma GCC target("avx,avx2")
  3.  
  4. #include <bits/stdc++.h>
  5. #define all(x) begin(x), end(x)
  6.  
  7. void InitIO(std::string name = "") {
  8.     using namespace std;
  9.     ios_base::sync_with_stdio(false);
  10.     cin.tie(nullptr);
  11.     cout.tie(nullptr);
  12.     if (name.size()) {
  13.         assert(freopen((name + ".in").c_str(), "r", stdin));
  14.         assert(freopen((name + ".out").c_str(), "w", stdout));
  15.     }
  16. }
  17.  
  18. using namespace std;
  19. using ll = long long;
  20.  
  21. const int N = 100100;
  22.  
  23. struct Edge {
  24.     int f, t, w, id;
  25. };
  26.  
  27. vector<Edge> g[N];
  28. bool used[N];
  29.  
  30. int DfsCount(int from, int par = 0) {
  31.     int ans = 1;
  32.     for (auto& [f, t, w, id] : g[from]) {
  33.         if (!used[id] && par != t) {
  34.             ans += DfsCount(t, f);
  35.         }
  36.     }
  37.     return ans;
  38. }
  39.  
  40. void DfsUsed(int from, int par) {
  41.     for (auto& [f, t, w, id] : g[from]) {
  42.         if (!used[id]) {
  43.             used[id] = true;
  44.             DfsUsed(t, f);
  45.         }
  46.     }
  47. }
  48.  
  49. int main() {
  50.     InitIO();
  51.     int n;
  52.  
  53.     cin >> n;
  54.  
  55.     vector<Edge> edges;
  56.  
  57.     for (int i = 0; i < n - 1; i++) {
  58.         int f, t, w;
  59.         cin >> f >> t >> w;
  60.         f--, t--;
  61.         g[f].push_back(Edge{f, t, w, i});
  62.         g[t].push_back(Edge{t, f, w, i});
  63.         edges.push_back(Edge{f, t, w, i});
  64.     }
  65.     sort(all(edges), [&] (Edge& a, Edge& b) {
  66.         return a.w > b.w;
  67.     });
  68.  
  69.     long long ans = 0;
  70.     int active = 1;
  71.  
  72.     for (int i = 0; i < n - 1; i++) {
  73.         auto [f, t, w, id] = edges[i];
  74.         if (used[id]) continue;
  75.  
  76.         int a = DfsCount(f, t);
  77.         int b = DfsCount(t, f);
  78.         int cur = min(n - active, min(a, b) * 2);
  79.         active += cur;
  80.         ans += (1LL << w) * cur;
  81.  
  82.         used[id] = true;
  83.  
  84.         if (a < b) {
  85.             DfsUsed(f, t);
  86.         } else {
  87.             DfsUsed(t, f);
  88.         }
  89.     }
  90.  
  91.     cout << ans << endl;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement