niyaznigmatullin

Untitled

Mar 23rd, 2016
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.15 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. int const N = 1234567;
  4.  
  5. int banned[N], sz[N], ans[N];
  6.  
  7. std::vector<int> edges[N];
  8.  
  9. void dfs(int v, int pv) {
  10.   sz[v] = 1;
  11.   for (int i : edges[v]) {
  12.     if (banned[i] || i == pv) continue;
  13.     dfs(i, v);
  14.     sz[v] += sz[i];
  15.   }
  16. }
  17.  
  18. void go(int v, int pp) {
  19.   dfs(v, -1);
  20.   {
  21.     int pv = -1;
  22.     while (true) {
  23.       bool changed = false;
  24.       for (int i : edges[v]) {
  25.         if (banned[i] || i == pv) continue;
  26.         if (sz[i] * 2 > sz[v]) {
  27.           pv = v;
  28.           v = i;
  29.           changed = true;
  30.           break;
  31.         }
  32.       }
  33.       if (!changed) break;
  34.     }
  35.   }
  36.   ans[v] = pp;
  37.   banned[v] = true;
  38.   for (int i : edges[v]) {
  39.     if (banned[i]) continue;
  40.     go(i, v);
  41.   }
  42. }
  43.  
  44. int main() {
  45.   freopen("decomposition.in", "r", stdin);
  46.   freopen("decomposition.out", "w", stdout);
  47.   int n;
  48.   scanf("%d", &n);
  49.   for (int i = 0; i + 1 < n; i++) {
  50.     int v, u;
  51.     scanf("%d%d", &v, &u);
  52.     --v;
  53.     --u;
  54.     edges[v].push_back(u);
  55.     edges[u].push_back(v);
  56.   }
  57.   go(0, -1);
  58.   for (int i = 0; i < n; i++) {
  59.     if (i > 0) putchar(' ');
  60.     printf("%d", ans[i] + 1);
  61.   }
  62.   puts("");
  63. }
Advertisement
Add Comment
Please, Sign In to add comment