一、题目
二、解法分析
利用树形dp。给每个节点i设置经过该点的路径最大值数组dp[i]和经过该点的总路径最大值数组dp2[i]。如下图所示:
可列出如下状态转移方程:
路费可通过等差数列公式求得:
三、代码
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int>a[100005];
map<int,int>b[100005];
int dp[100005];
int dp2[100005];
int sum=0;
int maxn=0;
void dfs(int a1,int pre)
{
int max1=0;
int max2=0;
if(a[a1].size()==1&&a1!=1)
{
dp[a1]=0;
dp2[a1]=0;
return;
}
vector<int>::iterator it;
for(it=a[a1].begin();it!=a[a1].end();it++)
{
int q=*it;
int t;
if(*it==pre)
continue;
else{
dfs(q,a1);
if(dp[q]+b[a1][q]>max1)
{
t=max1;
max1=dp[q]+b[a1][q];
max2=t;
}
else if(dp[q]+b[a1][q]>max2)
max2=dp[q]+b[a1][q];
}
}
dp2[a1]=max1+max2;
if(dp2[a1]>maxn)
maxn=dp2[a1];
dp[a1]=max1;
}
int main()
{
cin>>n;
//树形dp
int p,q,d;
int i;
for(i=1;i<=n-1;i++)
{
cin>>p;
cin>>q;
cin>>d;
b[p][q]=d;
b[q][p]=d;
a[p].push_back(q);
a[q].push_back(p);
}
dfs(1,1);
int ans;
if(n==1)
ans=0;
else{
ans=(11+(maxn-1)+11)*maxn/2;
}
printf("%d\n",ans);
return 0;
}