Untitled
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