#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; } |