#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
const int K = 4;
const LL INF = 1000000000000000000ll;
struct E {
int p, c;
};
vector<vector<E>> es;
inline void mmax(LL& a, LL b) { if (b > a) a = b; }
struct S {
LL s[4];
};
void subsolve(
const vector<pair<S, int>>& sub,
LL*& even_b,
LL*& odd_b,
LL*& even2_b,
LL*& odd2_b,
LL*& even,
LL*& odd) {
even_b = new LL[sub.size() * 2 + 3];
odd_b = new LL[sub.size() * 2 + 3];
even2_b = new LL[sub.size() * 2 + 3];
odd2_b = new LL[sub.size() * 2 + 3];
even = &even_b[sub.size() + 1];
odd = &odd_b[sub.size() + 1];
LL* even2 = &even2_b[sub.size() + 1];
LL* odd2 = &odd2_b[sub.size() + 1];
for (int i=-(int)sub.size() - 1; i<=(int)sub.size()+1; ++i) {
even[i] = -INF * 2;
odd[i] = -INF * 2;
even2[i] = -INF * 2;
odd2[i] = -INF * 2;
}
even[0] = 0;
for (int i=0; i<sub.size(); ++i) {
auto& [s, c] = sub[i];
for (int j : {-i-1, i+1}) {
odd2[j] = odd[j];
even2[j] = even[j];
}
LL x = s.s[0] + c;
LL y = s.s[1] + c;
LL z = s.s[2] + c;
LL t = max(max(s.s[3] + c, s.s[0]), 0ll);
for (int j : {-i, i}) {
odd2[j] = max(odd[j] + t, even[j] + y);
even2[j] = max(even[j] + t, odd[j] + y);
}
for (int j=-i+1; j<=i-1; ++j) {
odd2[j] = max(max(odd[j] + t, even[j] + y), max(odd[j+1] + z, odd[j-1] + x));
even2[j] = max(max(even[j] + t, odd[j] + y), max(even[j+1] + z, even[j-1] + x));
}
for (int j=-i-1; j<=min(-i, i-1); ++j) {
mmax(odd2[j], odd[j+1] + z);
mmax(even2[j], even[j+1] + z);
}
for (int j=max(i,-i+1); j<=i+1; ++j) {
mmax(odd2[j], odd[j-1] + x);
mmax(even2[j], even[j-1] + x);
}
swap(odd, odd2);
swap(even, even2);
}
}
S solve(int p, int q) {
vector<pair<S, int>> sub[2];
for (const E& e : es[p]) {
if (e.p == q) continue;
if (sub[0].size() <= sub[1].size()) {
sub[0].push_back({solve(e.p, p), e.c});
} else {
sub[1].push_back({solve(e.p, p), e.c});
}
}
LL* even_b[2];
LL* odd_b[2];
LL* even2_b[2];
LL* odd2_b[2];
LL* even[2];
LL* odd[2];
for (int i=0; i<2; ++i) {
subsolve(sub[i], even_b[i], odd_b[i], even2_b[i], odd2_b[i], even[i], odd[i]);
}
S res;
res.s[0] = even[0][0];
res.s[1] = even[0][1];
res.s[2] = odd[0][0];
res.s[3] = even[0][-1];
int size[2] = {sub[0].size(), sub[1].size()};
for (int i=-size[1]; i<=size[1]; ++i) {
mmax(res.s[0], even[0][-i] + even[1][i]);
mmax(res.s[0], odd[0][-i] + odd[1][i]);
mmax(res.s[1], even[0][-i+1] + even[1][i]);
mmax(res.s[1], odd[0][-i+1] + odd[1][i]);
mmax(res.s[2], even[0][-i] + odd[1][i]);
mmax(res.s[2], odd[0][-i] + even[1][i]);
mmax(res.s[3], even[0][-i-1] + even[1][i]);
mmax(res.s[3], odd[0][-i-1] + odd[1][i]);
}
// printf("Recurse %d -> %d\n", q+1, p+1);
// printf("Sub size %d\n", sub.size());
// printf("Solution: %lld %lld %lld %lld\n\n", res.s[0], res.s[1], res.s[2], res.s[3]);
for (int i=0; i<2; ++i) {
delete[] even_b[i];
delete[] odd_b[i];
delete[] even2_b[i];
delete[] odd2_b[i];
}
return res;
}
int main() {
int n; scanf("%d", &n);
es.resize(n);
for (int i=0; i<n-1; ++i) {
int a, b, c; scanf("%d %d %d", &a, &b, &c); --a; --b;
es[a].push_back({b, c});
es[b].push_back({a, c});
}
S s = solve(0, -1);
printf("%lld\n", s.s[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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | #include <cstdio> #include <vector> using namespace std; typedef long long LL; const int K = 4; const LL INF = 1000000000000000000ll; struct E { int p, c; }; vector<vector<E>> es; inline void mmax(LL& a, LL b) { if (b > a) a = b; } struct S { LL s[4]; }; void subsolve( const vector<pair<S, int>>& sub, LL*& even_b, LL*& odd_b, LL*& even2_b, LL*& odd2_b, LL*& even, LL*& odd) { even_b = new LL[sub.size() * 2 + 3]; odd_b = new LL[sub.size() * 2 + 3]; even2_b = new LL[sub.size() * 2 + 3]; odd2_b = new LL[sub.size() * 2 + 3]; even = &even_b[sub.size() + 1]; odd = &odd_b[sub.size() + 1]; LL* even2 = &even2_b[sub.size() + 1]; LL* odd2 = &odd2_b[sub.size() + 1]; for (int i=-(int)sub.size() - 1; i<=(int)sub.size()+1; ++i) { even[i] = -INF * 2; odd[i] = -INF * 2; even2[i] = -INF * 2; odd2[i] = -INF * 2; } even[0] = 0; for (int i=0; i<sub.size(); ++i) { auto& [s, c] = sub[i]; for (int j : {-i-1, i+1}) { odd2[j] = odd[j]; even2[j] = even[j]; } LL x = s.s[0] + c; LL y = s.s[1] + c; LL z = s.s[2] + c; LL t = max(max(s.s[3] + c, s.s[0]), 0ll); for (int j : {-i, i}) { odd2[j] = max(odd[j] + t, even[j] + y); even2[j] = max(even[j] + t, odd[j] + y); } for (int j=-i+1; j<=i-1; ++j) { odd2[j] = max(max(odd[j] + t, even[j] + y), max(odd[j+1] + z, odd[j-1] + x)); even2[j] = max(max(even[j] + t, odd[j] + y), max(even[j+1] + z, even[j-1] + x)); } for (int j=-i-1; j<=min(-i, i-1); ++j) { mmax(odd2[j], odd[j+1] + z); mmax(even2[j], even[j+1] + z); } for (int j=max(i,-i+1); j<=i+1; ++j) { mmax(odd2[j], odd[j-1] + x); mmax(even2[j], even[j-1] + x); } swap(odd, odd2); swap(even, even2); } } S solve(int p, int q) { vector<pair<S, int>> sub[2]; for (const E& e : es[p]) { if (e.p == q) continue; if (sub[0].size() <= sub[1].size()) { sub[0].push_back({solve(e.p, p), e.c}); } else { sub[1].push_back({solve(e.p, p), e.c}); } } LL* even_b[2]; LL* odd_b[2]; LL* even2_b[2]; LL* odd2_b[2]; LL* even[2]; LL* odd[2]; for (int i=0; i<2; ++i) { subsolve(sub[i], even_b[i], odd_b[i], even2_b[i], odd2_b[i], even[i], odd[i]); } S res; res.s[0] = even[0][0]; res.s[1] = even[0][1]; res.s[2] = odd[0][0]; res.s[3] = even[0][-1]; int size[2] = {sub[0].size(), sub[1].size()}; for (int i=-size[1]; i<=size[1]; ++i) { mmax(res.s[0], even[0][-i] + even[1][i]); mmax(res.s[0], odd[0][-i] + odd[1][i]); mmax(res.s[1], even[0][-i+1] + even[1][i]); mmax(res.s[1], odd[0][-i+1] + odd[1][i]); mmax(res.s[2], even[0][-i] + odd[1][i]); mmax(res.s[2], odd[0][-i] + even[1][i]); mmax(res.s[3], even[0][-i-1] + even[1][i]); mmax(res.s[3], odd[0][-i-1] + odd[1][i]); } // printf("Recurse %d -> %d\n", q+1, p+1); // printf("Sub size %d\n", sub.size()); // printf("Solution: %lld %lld %lld %lld\n\n", res.s[0], res.s[1], res.s[2], res.s[3]); for (int i=0; i<2; ++i) { delete[] even_b[i]; delete[] odd_b[i]; delete[] even2_b[i]; delete[] odd2_b[i]; } return res; } int main() { int n; scanf("%d", &n); es.resize(n); for (int i=0; i<n-1; ++i) { int a, b, c; scanf("%d %d %d", &a, &b, &c); --a; --b; es[a].push_back({b, c}); es[b].push_back({a, c}); } S s = solve(0, -1); printf("%lld\n", s.s[0]); } |
English