#include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; const long long INF=1e18; vector<PII> G[200005]; long long dp[200005][5]; long long sum1[400015][2]; long long sum2[400015][2]; void dfs(int v, int p, int w) { for(PII u:G[v])if(u.first!=p) { dfs(u.first, v, u.second); } int sz=G[v].size(); for(int i=0;i<=2*sz;i++)sum1[i][0]=-INF, sum1[i][1]=-INF; for(int i=0;i<=2*sz;i++)sum2[i][0]=-INF, sum2[i][1]=-INF; sum1[sz][0]=0; for(PII u:G[v])if(u.first!=p) { for(int i=0;i<=2*sz;i++) { if(sum1[i][0]!=-INF)sum2[i][0]=sum1[i][0]+max(dp[u.first][0], dp[u.first][4]); //04 if(sum1[i][1]!=-INF)sum2[i][1]=sum1[i][1]+max(dp[u.first][0], dp[u.first][4]); //04 if(sum1[i][1]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i][1]+dp[u.first][2]); //2 if(sum1[i][0]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i][0]+dp[u.first][2]); //2 } for(int i=1;i<=2*sz;i++) { if(sum1[i-1][0]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i-1][0]+dp[u.first][1]); //1 if(sum1[i-1][1]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i-1][1]+dp[u.first][1]); //1 } for(int i=0;i<2*sz;i++) { if(sum1[i+1][0]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i+1][0]+dp[u.first][3]); //3 if(sum1[i+1][1]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i+1][1]+dp[u.first][3]); //3 } for(int i=0;i<=2*sz;i++)sum1[i][0]=sum2[i][0], sum1[i][1]=sum2[i][1]; for(int i=0;i<=2*sz;i++)sum2[i][0]=-INF, sum2[i][1]=-INF; } dp[v][0]=sum1[sz][0]; dp[v][1]=sum1[sz][0]+w; dp[v][2]=sum1[sz+1][0]+w; dp[v][3]=sum1[sz][1]+w; dp[v][4]=sum1[sz-1][0]+w; // cout<<v<<": "; // for(int i=0;i<5;i++)cout<<dp[v][i]<<" ";cout<<endl; } int main() { ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<n;i++) { int a,b,c; cin>>a>>b>>c; G[a].push_back({b,c}); G[b].push_back({a,c}); } dfs(1,0,0); cout<<dp[1][0]<<endl; }
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 | #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; const long long INF=1e18; vector<PII> G[200005]; long long dp[200005][5]; long long sum1[400015][2]; long long sum2[400015][2]; void dfs(int v, int p, int w) { for(PII u:G[v])if(u.first!=p) { dfs(u.first, v, u.second); } int sz=G[v].size(); for(int i=0;i<=2*sz;i++)sum1[i][0]=-INF, sum1[i][1]=-INF; for(int i=0;i<=2*sz;i++)sum2[i][0]=-INF, sum2[i][1]=-INF; sum1[sz][0]=0; for(PII u:G[v])if(u.first!=p) { for(int i=0;i<=2*sz;i++) { if(sum1[i][0]!=-INF)sum2[i][0]=sum1[i][0]+max(dp[u.first][0], dp[u.first][4]); //04 if(sum1[i][1]!=-INF)sum2[i][1]=sum1[i][1]+max(dp[u.first][0], dp[u.first][4]); //04 if(sum1[i][1]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i][1]+dp[u.first][2]); //2 if(sum1[i][0]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i][0]+dp[u.first][2]); //2 } for(int i=1;i<=2*sz;i++) { if(sum1[i-1][0]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i-1][0]+dp[u.first][1]); //1 if(sum1[i-1][1]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i-1][1]+dp[u.first][1]); //1 } for(int i=0;i<2*sz;i++) { if(sum1[i+1][0]!=-INF)sum2[i][0]=max(sum2[i][0], sum1[i+1][0]+dp[u.first][3]); //3 if(sum1[i+1][1]!=-INF)sum2[i][1]=max(sum2[i][1], sum1[i+1][1]+dp[u.first][3]); //3 } for(int i=0;i<=2*sz;i++)sum1[i][0]=sum2[i][0], sum1[i][1]=sum2[i][1]; for(int i=0;i<=2*sz;i++)sum2[i][0]=-INF, sum2[i][1]=-INF; } dp[v][0]=sum1[sz][0]; dp[v][1]=sum1[sz][0]+w; dp[v][2]=sum1[sz+1][0]+w; dp[v][3]=sum1[sz][1]+w; dp[v][4]=sum1[sz-1][0]+w; // cout<<v<<": "; // for(int i=0;i<5;i++)cout<<dp[v][i]<<" ";cout<<endl; } int main() { ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<n;i++) { int a,b,c; cin>>a>>b>>c; G[a].push_back({b,c}); G[b].push_back({a,c}); } dfs(1,0,0); cout<<dp[1][0]<<endl; } |