rembocoder

Untitled

Mar 10th, 2023
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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.  
Advertisement
Add Comment
Please, Sign In to add comment