Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int int64_t
- vector<vector<int>> g;
- vector<bool> del;
- vector<vector<int>> centroids;
- vector<vector<int>> depths;
- vector<int> sz;
- void find_sz(int v, int p) {
- sz[v] = 1;
- for (int to: g[v]) {
- if (to == p || del[to]) {
- continue;
- }
- find_sz(to, v);
- sz[v] += sz[to];
- }
- }
- int find_center(int v, int p, int total_sz) {
- for (int to: g[v]) {
- if (to == p || del[to]) {
- continue;
- }
- if (sz[to] * 2 >= total_sz) {
- return find_center(to, v, total_sz);
- }
- }
- return v;
- }
- void update_list(int v, int p, int center, int depth) {
- centroids[v].push_back(center);
- depths[v].push_back(depth);
- for (int to: g[v]) {
- if (to == p || del[to]) {
- continue;
- }
- update_list(to, v, center, depth + 1);
- }
- }
- void centroid_decomposition(int v) {
- find_sz(v, -1);
- v = find_center(v, -1, sz[v]);
- update_list(v, -1, v, 0);
- del[v] = true;
- for (int to: g[v]) {
- if (!del[to]) {
- centroid_decomposition(to);
- }
- }
- }
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0); cout.tie(0);
- int n;
- cin >> n;
- g.resize(n);
- del.resize(n);
- centroids.resize(n);
- sz.resize(n);
- for (int i = 0; i < n - 1; i++) {
- int a, b;
- cin >> a >> b;
- a--; b--;
- g[a].push_back(b);
- g[b].push_back(a);
- }
- centroid_decomposition(0);
- for (int i = 0; i < n; i++) {
- cerr << i + 1 << ": ";
- for (int v: centroids[i]) {
- cerr << v + 1 << ' ';
- }
- cerr << endl;
- }
- /*int v;
- cin >> v;
- v--;
- for (int i = 0; i < centroids[v].size(); i++) {
- int c = centroids[v][i];
- int d = depths[v][i];
- s[c].insert(d);
- }*/
- }
Add Comment
Please, Sign In to add comment