#include<bits/stdc++.h> #define ff first #define ss second #define mp make_pair using namespace std; typedef long long lld; constexpr int MAX_N = 200000; constexpr int STEPS = 4; constexpr long long LINF = (1ll << 60)-1; long long mx[STEPS]; int count1, count0; long long dp[MAX_N][STEPS]; vector<pair<int,lld> > v[MAX_N+9]; void f(int i, size_t j, long long sm) { if(max(-count0, count0) + count1 > (int)(v[i].size() - j)) { return; } if(j < v[i].size()) { lld mx_cp[STEPS]; for(int h = 1; h < STEPS; ++h) mx_cp[h] = mx[h]; mx[1] = max(mx[1], v[i][j].ss); mx[2] = max(mx[2], v[i][j].ss + dp[v[i][j].ff][1] - dp[v[i][j].ff][0]); mx[3] = max(mx[3], v[i][j].ss + dp[v[i][j].ff][2] - dp[v[i][j].ff][0]); f(i, j+1, sm + dp[v[i][j].ff][0]); for(int h = 1; h < STEPS; ++h) mx[h] = mx_cp[h]; if(dp[v[i][j].ff][0] < v[i][j].ss + dp[v[i][j].ff][3]) f(i, j+1, sm + v[i][j].ss + dp[v[i][j].ff][3]); sm += v[i][j].ss; count0++; f(i, j+1, sm + dp[v[i][j].ff][0]); count0 -= 2; f(i, j+1, sm + dp[v[i][j].ff][2]); count0++; count1 ^= 1; f(i, j+1, sm + dp[v[i][j].ff][1]); count1 ^= 1; return; } else { dp[i][0] = max(dp[i][0], sm); dp[i][1] = max(dp[i][1], sm + mx[1]); dp[i][2] = max(dp[i][2], sm + mx[2]); dp[i][3] = max(dp[i][3], sm + mx[3]); } } void dfs(int i, int p) { for(size_t j = 1; j < v[i].size(); ++j) { if(v[i][j].ff == p) { swap(v[i][j], v[i][0]); } dfs(v[i][j].ff, i); } for(int h = 1; h < STEPS; ++h) { dp[i][h] = -LINF; mx[h] = -LINF; } dp[i][0] = 0; count0 = 0; count1 = 0; f(i, 1, 0); /* printf("dfs:%d->%d\n", p, i); for(int h = 0; h < STEPS; ++h) { printf("dp[%d][%d] = %lld\n", i, h, dp[i][h]); } //*/ } int main() { int n; scanf("%d", &n); for(int i = 1; i < n; ++i) { int a,b,c; scanf("%d%d%d", &a, &b, &c); v[a].push_back(mp(b,c)); v[b].push_back(mp(a,c)); } v[1].push_back(mp(0,0)); dfs(1,0); printf("%lld\n", dp[1][0]); 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 | #include<bits/stdc++.h> #define ff first #define ss second #define mp make_pair using namespace std; typedef long long lld; constexpr int MAX_N = 200000; constexpr int STEPS = 4; constexpr long long LINF = (1ll << 60)-1; long long mx[STEPS]; int count1, count0; long long dp[MAX_N][STEPS]; vector<pair<int,lld> > v[MAX_N+9]; void f(int i, size_t j, long long sm) { if(max(-count0, count0) + count1 > (int)(v[i].size() - j)) { return; } if(j < v[i].size()) { lld mx_cp[STEPS]; for(int h = 1; h < STEPS; ++h) mx_cp[h] = mx[h]; mx[1] = max(mx[1], v[i][j].ss); mx[2] = max(mx[2], v[i][j].ss + dp[v[i][j].ff][1] - dp[v[i][j].ff][0]); mx[3] = max(mx[3], v[i][j].ss + dp[v[i][j].ff][2] - dp[v[i][j].ff][0]); f(i, j+1, sm + dp[v[i][j].ff][0]); for(int h = 1; h < STEPS; ++h) mx[h] = mx_cp[h]; if(dp[v[i][j].ff][0] < v[i][j].ss + dp[v[i][j].ff][3]) f(i, j+1, sm + v[i][j].ss + dp[v[i][j].ff][3]); sm += v[i][j].ss; count0++; f(i, j+1, sm + dp[v[i][j].ff][0]); count0 -= 2; f(i, j+1, sm + dp[v[i][j].ff][2]); count0++; count1 ^= 1; f(i, j+1, sm + dp[v[i][j].ff][1]); count1 ^= 1; return; } else { dp[i][0] = max(dp[i][0], sm); dp[i][1] = max(dp[i][1], sm + mx[1]); dp[i][2] = max(dp[i][2], sm + mx[2]); dp[i][3] = max(dp[i][3], sm + mx[3]); } } void dfs(int i, int p) { for(size_t j = 1; j < v[i].size(); ++j) { if(v[i][j].ff == p) { swap(v[i][j], v[i][0]); } dfs(v[i][j].ff, i); } for(int h = 1; h < STEPS; ++h) { dp[i][h] = -LINF; mx[h] = -LINF; } dp[i][0] = 0; count0 = 0; count1 = 0; f(i, 1, 0); /* printf("dfs:%d->%d\n", p, i); for(int h = 0; h < STEPS; ++h) { printf("dp[%d][%d] = %lld\n", i, h, dp[i][h]); } //*/ } int main() { int n; scanf("%d", &n); for(int i = 1; i < n; ++i) { int a,b,c; scanf("%d%d%d", &a, &b, &c); v[a].push_back(mp(b,c)); v[b].push_back(mp(a,c)); } v[1].push_back(mp(0,0)); dfs(1,0); printf("%lld\n", dp[1][0]); return 0; } |