Untitled
unknown
plain_text
a year ago
2.0 kB
14
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