Skip to content

Commit 41b4a59

Browse files
committed
shallowest decomp tree
1 parent 1eb2ee7 commit 41b4a59

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#pragma once
2+
void shallowest(auto& adj, auto f) {
3+
vector<vi> order(bit_width(size(adj)));
4+
auto dfs = [&](auto&& self, int v, int p) -> int {
5+
int once = 0, twice = 0;
6+
for (int u : adj[v])
7+
if (u != p) {
8+
int dp = self(self, u, v);
9+
twice |= once & dp, once |= dp;
10+
}
11+
auto dp = (once | (bit_ceil(twice + 1u) - 1)) + 1;
12+
order[countr_zero(dp)].push_back(v);
13+
return dp;
14+
};
15+
dfs(dfs, 0, 0);
16+
for (auto& vec : order | views::reverse)
17+
for (int cent : vec) {
18+
f(cent);
19+
for (int v : adj[cent]) {
20+
iter_swap(ranges::find(adj[v], cent),
21+
rbegin(adj[v]));
22+
adj[v].pop_back();
23+
}
24+
}
25+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#define PROBLEM \
2+
"https://onlinejudge.u-aizu.ac.jp/problems/GRL_5_B"
3+
#include "../template.hpp"
4+
#include "../../../library/trees/shallowest_decomp_tree.hpp"
5+
int main() {
6+
cin.tie(0)->sync_with_stdio(0);
7+
int n;
8+
cin >> n;
9+
vector<vector<int>> adj(n);
10+
map<pair<int, int>, int> weight;
11+
for (int i = 0; i < n - 1; i++) {
12+
int u, v, w;
13+
cin >> u >> v >> w;
14+
weight[{u, v}] = w;
15+
weight[{v, u}] = w;
16+
adj[u].push_back(v);
17+
adj[v].push_back(u);
18+
}
19+
vector<int> res(n);
20+
shallowest(adj, [&](int cent) {
21+
int lowest = 0;
22+
int curr_lowest = 0;
23+
auto dfs = [&](auto&& self, int v, int p,
24+
int height) -> void {
25+
res[v] = max(res[v], height + lowest);
26+
res[cent] = max(res[cent], height);
27+
curr_lowest = max(curr_lowest, height);
28+
for (int u : adj[v])
29+
if (u != p)
30+
self(self, u, v, height + weight[{u, v}]);
31+
};
32+
for (int v : adj[cent]) {
33+
curr_lowest = 0;
34+
dfs(dfs, v, cent, weight[{v, cent}]);
35+
lowest = max(lowest, curr_lowest);
36+
}
37+
lowest = 0;
38+
for (int v : adj[cent] | views::reverse) {
39+
curr_lowest = 0;
40+
dfs(dfs, v, cent, weight[{v, cent}]);
41+
lowest = max(lowest, curr_lowest);
42+
}
43+
});
44+
for (int i = 0; i < n; i++) cout << res[i] << '\n';
45+
}

0 commit comments

Comments
 (0)