#include <bits/stdc++.h>
#include <random>
#define ll long long int
#define pb push_back
#define st first
#define nd second
#define pii pair<int,int>
#define mp make_pair
#define pll pair<long long,long long>
#define ld long double
#define ull unsigned long long
using namespace std;
const int nax = 2e5 + 5;
const ll inf = 1e18;
vector<pii> adj[nax];
const int SQRT = 1020;
ll dp[nax][4];
int n;
ll gone[2][SQRT * 2][2];
vector<ll> koszty[5];
vector<int> perm;
void dfs(int v, int p){
for(int i=0;i<4;i++) dp[v][i] = -inf;
for(pii cur : adj[v]){
if(cur.st != p) dfs(cur.st, v);
}
for(int i=0;i<5;i++) koszty[i].clear();
int syny = 0;
for(pii cur : adj[v]){
if(cur.st != p){
syny += 1;
ll edgeCost = cur.nd;
for(int i=0;i<5;i++){
ll akt = 0;
if(i == 0) akt = dp[cur.st][0];
if(i >= 1){
akt = dp[cur.st][i - 1] + edgeCost;
}
koszty[i].pb(akt);
}
}
}
if(syny == 0){
dp[v][0] = 0;
return;
}
perm.clear();
for(int i=0;i<syny;i++) perm.pb(i);
for(int i=0;i<1;i++){
for(int j=0;j<SQRT*2;j++){
for(int k=0;k<2;k++){
gone[i][j][k] = -inf;
}
}
}
random_shuffle(perm.begin(), perm.end());
int id = perm[0];
gone[0][SQRT][0] = 0;
for(int i=0;i<5;i++){
int przewagaJedynek = 0;
if(i == 1) przewagaJedynek = 1;
if(i == 3) przewagaJedynek = -1;
gone[0][SQRT + przewagaJedynek][i == 2] = max(gone[0][SQRT + przewagaJedynek][i == 2], koszty[i][id]);
}
int sz = perm.size();
for(int i=0;i<sz-1;i++){
int layer = (i & 1);
int nxtLayer = 1 - layer;
for(int j=0;j<SQRT*2;j++){
for(int k=0;k<2;k++) gone[nxtLayer][j][k] = gone[layer][j][k];
}
int id = perm[i + 1];
for(int teraz=0;teraz<5;teraz++){
int przewagaJedynek = 0;
if(teraz == 1) przewagaJedynek = 1;
if(teraz == 3) przewagaJedynek = -1;
int LOW = - SQRT;
int HIGH = SQRT - 1;
if(przewagaJedynek == 1) HIGH -= 1;
if(przewagaJedynek == -1) LOW += 1;
for(int j=LOW;j<=HIGH;j++){
for(int k=0;k<2;k++){
gone[nxtLayer][SQRT + j + przewagaJedynek][(k + (teraz == 2)) & 1] = max(gone[nxtLayer][SQRT + j + przewagaJedynek][(k + (teraz == 2)) & 1], gone[layer][SQRT + j][k] + koszty[teraz][id]);
}
}
}
}
int layer = ((sz - 1) & 1);
dp[v][0] = max(dp[v][0], gone[layer][SQRT][0]);
dp[v][1] = max(dp[v][1], gone[layer][SQRT + 1][0]);
dp[v][2] = max(dp[v][2], gone[layer][SQRT][1]);
dp[v][3] = max(dp[v][3], gone[layer][SQRT - 1][0]);
}
void solve(){
cin >> n;
for(int i=1;i<n;i++){
int x, y, z; cin >> x >> y >> z;
adj[x].pb(mp(y, z));
adj[y].pb(mp(x, z));
}
dfs(1, 1);
cout << dp[1][0];
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
srand(10422);
int tt = 1;
// cin >> tt;
while(tt--) solve();
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 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 | #include <bits/stdc++.h> #include <random> #define ll long long int #define pb push_back #define st first #define nd second #define pii pair<int,int> #define mp make_pair #define pll pair<long long,long long> #define ld long double #define ull unsigned long long using namespace std; const int nax = 2e5 + 5; const ll inf = 1e18; vector<pii> adj[nax]; const int SQRT = 1020; ll dp[nax][4]; int n; ll gone[2][SQRT * 2][2]; vector<ll> koszty[5]; vector<int> perm; void dfs(int v, int p){ for(int i=0;i<4;i++) dp[v][i] = -inf; for(pii cur : adj[v]){ if(cur.st != p) dfs(cur.st, v); } for(int i=0;i<5;i++) koszty[i].clear(); int syny = 0; for(pii cur : adj[v]){ if(cur.st != p){ syny += 1; ll edgeCost = cur.nd; for(int i=0;i<5;i++){ ll akt = 0; if(i == 0) akt = dp[cur.st][0]; if(i >= 1){ akt = dp[cur.st][i - 1] + edgeCost; } koszty[i].pb(akt); } } } if(syny == 0){ dp[v][0] = 0; return; } perm.clear(); for(int i=0;i<syny;i++) perm.pb(i); for(int i=0;i<1;i++){ for(int j=0;j<SQRT*2;j++){ for(int k=0;k<2;k++){ gone[i][j][k] = -inf; } } } random_shuffle(perm.begin(), perm.end()); int id = perm[0]; gone[0][SQRT][0] = 0; for(int i=0;i<5;i++){ int przewagaJedynek = 0; if(i == 1) przewagaJedynek = 1; if(i == 3) przewagaJedynek = -1; gone[0][SQRT + przewagaJedynek][i == 2] = max(gone[0][SQRT + przewagaJedynek][i == 2], koszty[i][id]); } int sz = perm.size(); for(int i=0;i<sz-1;i++){ int layer = (i & 1); int nxtLayer = 1 - layer; for(int j=0;j<SQRT*2;j++){ for(int k=0;k<2;k++) gone[nxtLayer][j][k] = gone[layer][j][k]; } int id = perm[i + 1]; for(int teraz=0;teraz<5;teraz++){ int przewagaJedynek = 0; if(teraz == 1) przewagaJedynek = 1; if(teraz == 3) przewagaJedynek = -1; int LOW = - SQRT; int HIGH = SQRT - 1; if(przewagaJedynek == 1) HIGH -= 1; if(przewagaJedynek == -1) LOW += 1; for(int j=LOW;j<=HIGH;j++){ for(int k=0;k<2;k++){ gone[nxtLayer][SQRT + j + przewagaJedynek][(k + (teraz == 2)) & 1] = max(gone[nxtLayer][SQRT + j + przewagaJedynek][(k + (teraz == 2)) & 1], gone[layer][SQRT + j][k] + koszty[teraz][id]); } } } } int layer = ((sz - 1) & 1); dp[v][0] = max(dp[v][0], gone[layer][SQRT][0]); dp[v][1] = max(dp[v][1], gone[layer][SQRT + 1][0]); dp[v][2] = max(dp[v][2], gone[layer][SQRT][1]); dp[v][3] = max(dp[v][3], gone[layer][SQRT - 1][0]); } void solve(){ cin >> n; for(int i=1;i<n;i++){ int x, y, z; cin >> x >> y >> z; adj[x].pb(mp(y, z)); adj[y].pb(mp(x, z)); } dfs(1, 1); cout << dp[1][0]; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); srand(10422); int tt = 1; // cin >> tt; while(tt--) solve(); return 0; } |
English