#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define per(i, a, b) for (int i = b; a <= i; i--)
#define cat(x) cerr << #x << " = " << x << '\n';
using ll = long long;
using namespace std;
const int N = 200200;
const ll inf = 1e18;
const int M = 475;
inline void upd(ll &a, const ll b) {
a = max(a, b);
}
int n;
vector<pair<int, int>> e[N];
ll f[N][4];
vector<ll> dp[N][2], g[2];
void dfs(int u, int p) {
int sz = max(1, min(M, int(e[u].size()) / 2));
dp[u][0].resize(2 * sz + 1, -inf);
dp[u][1].resize(2 * sz + 1, -inf);
dp[u][0][sz] = 0;
int cnt = 0;
for (auto [v, w] : e[u]) {
if (v == p)
continue;
dfs(v, u);
g[0].resize(2 * sz + 1);
fill(g[0].begin(), g[0].end(), -inf);
g[1].resize(2 * sz + 1);
fill(g[1].begin(), g[1].end(), -inf);
int L = max(0, sz - cnt);
int R = min(2 * sz, sz + cnt);
ll cur;
rep(j, 0, 1) {
rep(i, L, R) {
cur = dp[u][j][i];
if (cur == -inf)
continue;
// 0 without edge
upd(g[j][i], cur + f[v][0]);
cur += w;
// 0 with edge
if (i + 1 <= 2 * sz)
upd(g[j][i + 1], cur + f[v][0]);
// 1
upd(g[j ^ 1][i], cur + f[v][1]);
// 2
if (0 <= i - 1)
upd(g[j][i - 1], cur + f[v][2]);
// 3
upd(g[j][i], cur + f[v][3]);
}
}
dp[u][0] = g[0];
dp[u][1] = g[1];
cnt++;
}
f[u][0] = dp[u][0][sz];
f[u][1] = dp[u][0][sz + 1];
f[u][2] = dp[u][1][sz];
f[u][3] = dp[u][0][sz - 1];
}
int main() {
cin.tie(0)->sync_with_stdio(0);
srand(233);
cin >> n;
rep(i, 2, n) {
int a, b, c;
cin >> a >> b >> c;
e[a].push_back({b, c});
e[b].push_back({a, c});
}
rep(i, 1, n) {
random_shuffle(e[i].begin(), e[i].end());
}
dfs(1, 0);
cout << f[1][0] << '\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define per(i, a, b) for (int i = b; a <= i; i--) #define cat(x) cerr << #x << " = " << x << '\n'; using ll = long long; using namespace std; const int N = 200200; const ll inf = 1e18; const int M = 475; inline void upd(ll &a, const ll b) { a = max(a, b); } int n; vector<pair<int, int>> e[N]; ll f[N][4]; vector<ll> dp[N][2], g[2]; void dfs(int u, int p) { int sz = max(1, min(M, int(e[u].size()) / 2)); dp[u][0].resize(2 * sz + 1, -inf); dp[u][1].resize(2 * sz + 1, -inf); dp[u][0][sz] = 0; int cnt = 0; for (auto [v, w] : e[u]) { if (v == p) continue; dfs(v, u); g[0].resize(2 * sz + 1); fill(g[0].begin(), g[0].end(), -inf); g[1].resize(2 * sz + 1); fill(g[1].begin(), g[1].end(), -inf); int L = max(0, sz - cnt); int R = min(2 * sz, sz + cnt); ll cur; rep(j, 0, 1) { rep(i, L, R) { cur = dp[u][j][i]; if (cur == -inf) continue; // 0 without edge upd(g[j][i], cur + f[v][0]); cur += w; // 0 with edge if (i + 1 <= 2 * sz) upd(g[j][i + 1], cur + f[v][0]); // 1 upd(g[j ^ 1][i], cur + f[v][1]); // 2 if (0 <= i - 1) upd(g[j][i - 1], cur + f[v][2]); // 3 upd(g[j][i], cur + f[v][3]); } } dp[u][0] = g[0]; dp[u][1] = g[1]; cnt++; } f[u][0] = dp[u][0][sz]; f[u][1] = dp[u][0][sz + 1]; f[u][2] = dp[u][1][sz]; f[u][3] = dp[u][0][sz - 1]; } int main() { cin.tie(0)->sync_with_stdio(0); srand(233); cin >> n; rep(i, 2, n) { int a, b, c; cin >> a >> b >> c; e[a].push_back({b, c}); e[b].push_back({a, c}); } rep(i, 1, n) { random_shuffle(e[i].begin(), e[i].end()); } dfs(1, 0); cout << f[1][0] << '\n'; return 0; } |
English