Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- int const N = 1234567;
- int banned[N], sz[N], ans[N];
- std::vector<int> edges[N];
- void dfs(int v, int pv) {
- sz[v] = 1;
- for (int i : edges[v]) {
- if (banned[i] || i == pv) continue;
- dfs(i, v);
- sz[v] += sz[i];
- }
- }
- void go(int v, int pp) {
- dfs(v, -1);
- {
- int pv = -1;
- while (true) {
- bool changed = false;
- for (int i : edges[v]) {
- if (banned[i] || i == pv) continue;
- if (sz[i] * 2 > sz[v]) {
- pv = v;
- v = i;
- changed = true;
- break;
- }
- }
- if (!changed) break;
- }
- }
- ans[v] = pp;
- banned[v] = true;
- for (int i : edges[v]) {
- if (banned[i]) continue;
- go(i, v);
- }
- }
- int main() {
- freopen("decomposition.in", "r", stdin);
- freopen("decomposition.out", "w", stdout);
- int n;
- scanf("%d", &n);
- for (int i = 0; i + 1 < n; i++) {
- int v, u;
- scanf("%d%d", &v, &u);
- --v;
- --u;
- edges[v].push_back(u);
- edges[u].push_back(v);
- }
- go(0, -1);
- for (int i = 0; i < n; i++) {
- if (i > 0) putchar(' ');
- printf("%d", ans[i] + 1);
- }
- puts("");
- }
Advertisement
Add Comment
Please, Sign In to add comment