rembocoder

Untitled

Mar 10th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define int int64_t
  6.  
  7. vector<vector<int>> g;
  8. vector<bool> del;
  9. vector<vector<int>> centroids;
  10. vector<vector<int>> depths;
  11. vector<int> sz;
  12.  
  13. void find_sz(int v, int p) {
  14.     sz[v] = 1;
  15.     for (int to: g[v]) {
  16.         if (to == p || del[to]) {
  17.             continue;
  18.         }
  19.         find_sz(to, v);
  20.         sz[v] += sz[to];
  21.     }
  22. }
  23.  
  24. int find_center(int v, int p, int total_sz) {
  25.     for (int to: g[v]) {
  26.         if (to == p || del[to]) {
  27.             continue;
  28.         }
  29.         if (sz[to] * 2 >= total_sz) {
  30.             return find_center(to, v, total_sz);
  31.         }
  32.     }
  33.     return v;
  34. }
  35.  
  36. void update_list(int v, int p, int center, int depth) {
  37.     centroids[v].push_back(center);
  38.     depths[v].push_back(depth);
  39.     for (int to: g[v]) {
  40.         if (to == p || del[to]) {
  41.             continue;
  42.         }
  43.         update_list(to, v, center, depth + 1);
  44.     }
  45. }
  46.  
  47. void centroid_decomposition(int v) {
  48.     find_sz(v, -1);
  49.     v = find_center(v, -1, sz[v]);
  50.     update_list(v, -1, v, 0);
  51.     del[v] = true;
  52.     for (int to: g[v]) {
  53.         if (!del[to]) {
  54.             centroid_decomposition(to);
  55.         }
  56.     }
  57. }
  58.  
  59. int32_t main() {
  60.     ios_base::sync_with_stdio(false);
  61.     cin.tie(0); cout.tie(0);
  62.     int n;
  63.     cin >> n;
  64.     g.resize(n);
  65.     del.resize(n);
  66.     centroids.resize(n);
  67.     sz.resize(n);
  68.     for (int i = 0; i < n - 1; i++) {
  69.         int a, b;
  70.         cin >> a >> b;
  71.         a--; b--;
  72.         g[a].push_back(b);
  73.         g[b].push_back(a);
  74.     }
  75.     centroid_decomposition(0);
  76.     for (int i = 0; i < n; i++) {
  77.         cerr << i + 1 << ": ";
  78.         for (int v: centroids[i]) {
  79.             cerr << v + 1 << ' ';
  80.         }
  81.         cerr << endl;
  82.     }
  83.  
  84.     /*int v;
  85.     cin >> v;
  86.     v--;
  87.     for (int i = 0; i < centroids[v].size(); i++) {
  88.         int c = centroids[v][i];
  89.         int d = depths[v][i];
  90.         s[c].insert(d);
  91.     }*/
  92. }
  93.  
Add Comment
Please, Sign In to add comment