//Jakub Rozek
//Poborcy podatkowi
//czas: 400n
//pamiec: n
#include "bits/stdc++.h"
using namespace std;
const int N=200005;
const long long INF=1000000000000015;
struct str{
long long a,b,c,d;
};
vector <pair<int,long long> > tv[N];
str dfs(int a, int b)
{
if(tv[a].size()==1)
{
return {0,-INF,-INF,-INF};
}
long long p;
int q=0,rn;
pair<int,long long> i;
int n=min(400,(int)tv[a].size()/2);
str w,odp;
long long dp[2][2][2*n+1];
for(int i=0; i<=2*n; ++i) dp[0][0][i]=-INF;
for(int i=0; i<=2*n; ++i) dp[0][1][i]=-INF;
dp[0][0][n]=0;
for(int it=(int)tv[a].size(); it>0; --it)
{
rn=rand()%it;
i.first=tv[a][rn].first;
i.second=tv[a][rn].second;
tv[a][rn].first=tv[a][it-1].first;
tv[a][rn].second=tv[a][it-1].second;
if(i.first==b) continue;
w=dfs(i.first,a);
p=w.d;
w.d=w.c+i.second;
w.c=w.b+i.second;
w.b=w.a+i.second;
w.a=max(w.a,p+i.second);
q=1-q;
dp[q][0][0]=max(w.a+dp[1-q][0][0], max(w.c+dp[1-q][1][0], w.d+dp[1-q][0][1]));
dp[q][1][0]=max(w.a+dp[1-q][1][0], max(w.c+dp[1-q][0][0], w.d+dp[1-q][1][1]));
for(int k=1; k<2*n; ++k)
{
dp[q][0][k]=max(w.a+dp[1-q][0][k], max(w.c+dp[1-q][1][k], max(w.b+dp[1-q][0][k-1], w.d+dp[1-q][0][k+1])));
dp[q][1][k]=max(w.a+dp[1-q][1][k], max(w.c+dp[1-q][0][k], max(w.b+dp[1-q][1][k-1], w.d+dp[1-q][1][k+1])));
}
dp[q][0][2*n]=max(w.a+dp[1-q][0][2*n], max(w.c+dp[1-q][1][2*n], w.b+dp[1-q][0][2*n-1]));
dp[q][1][2*n]=max(w.a+dp[1-q][1][2*n], max(w.c+dp[1-q][0][2*n], w.b+dp[1-q][1][2*n-1]));
}
odp.a=dp[q][0][n];
odp.b=dp[q][0][n+1];
odp.c=dp[q][1][n];
odp.d=dp[q][0][n-1];
return odp;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,x,y,z;
str wynik;
srand(56235623);
cin>>n;
for(int i=1; i<n; ++i)
{
cin>>x>>y>>z;
tv[x].push_back({y,z});
tv[y].push_back({x,z});
}
tv[1].push_back({0,-INF});
wynik=dfs(1,0);
cout<<wynik.a<<endl;
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 | //Jakub Rozek //Poborcy podatkowi //czas: 400n //pamiec: n #include "bits/stdc++.h" using namespace std; const int N=200005; const long long INF=1000000000000015; struct str{ long long a,b,c,d; }; vector <pair<int,long long> > tv[N]; str dfs(int a, int b) { if(tv[a].size()==1) { return {0,-INF,-INF,-INF}; } long long p; int q=0,rn; pair<int,long long> i; int n=min(400,(int)tv[a].size()/2); str w,odp; long long dp[2][2][2*n+1]; for(int i=0; i<=2*n; ++i) dp[0][0][i]=-INF; for(int i=0; i<=2*n; ++i) dp[0][1][i]=-INF; dp[0][0][n]=0; for(int it=(int)tv[a].size(); it>0; --it) { rn=rand()%it; i.first=tv[a][rn].first; i.second=tv[a][rn].second; tv[a][rn].first=tv[a][it-1].first; tv[a][rn].second=tv[a][it-1].second; if(i.first==b) continue; w=dfs(i.first,a); p=w.d; w.d=w.c+i.second; w.c=w.b+i.second; w.b=w.a+i.second; w.a=max(w.a,p+i.second); q=1-q; dp[q][0][0]=max(w.a+dp[1-q][0][0], max(w.c+dp[1-q][1][0], w.d+dp[1-q][0][1])); dp[q][1][0]=max(w.a+dp[1-q][1][0], max(w.c+dp[1-q][0][0], w.d+dp[1-q][1][1])); for(int k=1; k<2*n; ++k) { dp[q][0][k]=max(w.a+dp[1-q][0][k], max(w.c+dp[1-q][1][k], max(w.b+dp[1-q][0][k-1], w.d+dp[1-q][0][k+1]))); dp[q][1][k]=max(w.a+dp[1-q][1][k], max(w.c+dp[1-q][0][k], max(w.b+dp[1-q][1][k-1], w.d+dp[1-q][1][k+1]))); } dp[q][0][2*n]=max(w.a+dp[1-q][0][2*n], max(w.c+dp[1-q][1][2*n], w.b+dp[1-q][0][2*n-1])); dp[q][1][2*n]=max(w.a+dp[1-q][1][2*n], max(w.c+dp[1-q][0][2*n], w.b+dp[1-q][1][2*n-1])); } odp.a=dp[q][0][n]; odp.b=dp[q][0][n+1]; odp.c=dp[q][1][n]; odp.d=dp[q][0][n-1]; return odp; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n,x,y,z; str wynik; srand(56235623); cin>>n; for(int i=1; i<n; ++i) { cin>>x>>y>>z; tv[x].push_back({y,z}); tv[y].push_back({x,z}); } tv[1].push_back({0,-INF}); wynik=dfs(1,0); cout<<wynik.a<<endl; return 0; } |
English