Untitled

 avatar
unknown
plain_text
a year ago
2.0 kB
8
Indexable
//sub3
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 500005;

int numNode;
vector<int> adj[MAX_N];
int idx[MAX_N];
bool del[MAX_N];
int ans[MAX_N], cur;

void dfs(int node, int parent) {
    idx[node] = node;
    for (auto u : adj[node]) {
        if (u != parent && !del[u]) {
            dfs(u, node);
            idx[node] = min(idx[node], idx[u]);
        }
    }
}

void down(int node, int parent) {
    del[node] = true;
    ans[node] = cur;
    pair<int, int> path = make_pair(INT_MAX, -1);
    for (auto u : adj[node]) {
        if (u != parent && !del[u]) {
            path = min(path, make_pair(idx[u], u));
        }
    }

    if (path.second != -1) {
        down(path.second, node);
    }
}

void solve(int node) {
    dfs(node, 0);
    pair<int, int> path_1 = make_pair(INT_MAX, -1), path_2 = make_pair(INT_MAX, -1);
    for (auto u : adj[node]) {
        if (!del[u]) {
            pair<int, int> tmp = make_pair(idx[u], u);
            if (path_1 > tmp) {
                path_2 = path_1;
                path_1 = tmp;
            } else if (path_2 > tmp) {
                path_2 = tmp;
            }
        }
    }

    del[node] = true;
    ans[node] = cur;
    if (path_1.second != -1) {
        down(path_1.second, node);    }

    if (path_2.second != -1) {
        down(path_2.second, node);
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    freopen("treecolor.inp", "r", stdin);
    freopen("treecolor.out", "w", stdout);

    cin >> numNode;

    for (int i = 1; i <= numNode - 1; i++) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    cur = 0;
    for (int u = 1; u <= numNode; u++) {
        if (!del[u]) {
            cur++;
            solve(u);
        }
    }

    for (int u = 1; u <= numNode; u++) {
        cout << ans[u] << ' ';
    }
    cout << '\n';

    return 0;
}
Editor is loading...
Leave a Comment