Advertisement
ThegeekKnight16

The Cave polonês

Feb 22nd, 2024
1,373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = 5e4 + 10;
  4. array<vector<int>, MAXN> grafo;
  5. array<int, MAXN> cnt;
  6.  
  7. void dfs(int v, int p)
  8. {
  9.     for (auto viz : grafo[v])
  10.     {
  11.         if (viz == p) continue;
  12.         dfs(viz, v);
  13.     }
  14.  
  15.     int extra = 1;
  16.     for (int k = 17; k >= 0; k--)
  17.     {
  18.         int marc = 0;
  19.         for (auto viz : grafo[v])
  20.         {
  21.             if (viz == p) continue;
  22.             marc += (((cnt[viz]) >> k)&1);
  23.         }
  24.         if (marc <= 1) continue;
  25.         extra = 0;
  26.         cnt[v] = (1 << (k+1));
  27.         for (auto viz : grafo[v])
  28.         {
  29.             if (viz == p) continue;
  30.             cnt[v] += cnt[viz] - (cnt[viz] % (1 << (k+1)));
  31.         }
  32.         break;
  33.     }
  34.     if (extra == 1) for (auto viz : grafo[v]) if (viz != p) cnt[v] += cnt[viz];
  35.  
  36.     cnt[v] += extra;
  37.     // cerr << "v: " << v << ", cnt: " << bitset<4>(cnt[v]) << '\n';
  38. }
  39.  
  40. int main()
  41. {
  42.     ios_base::sync_with_stdio(false);
  43.     cin.tie(NULL);
  44.     int N;
  45.     cin >> N;
  46.     for (int i = 1; i < N; i++)
  47.     {
  48.         int X, Y;
  49.         cin >> X >> Y;
  50.         grafo[X].push_back(Y);
  51.         grafo[Y].push_back(X);
  52.     }
  53.  
  54.     dfs(1, 1);
  55.  
  56.     cout << 31 - __builtin_clz(cnt[1]) << '\n';
  57. }
  58.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement