标签:title log http size head 数据 ++ 树的直径 div
4
1 2 10
1 3 12
1 4 15
27
随便找个根. 先从下往上, 求出每个点到子树中最远和次远点的距离.(递归过程中)
然后再从上往下, 看从上面接下来的路径能有多长.(递归返回时)
直接把每个点的最长和次长加起来.
#include<iostream> #include<cstdio> using namespace std; int dp[10010][3],n,head[10010],num,ans; struct node{ int pre,to,v; }e[20010]; void Insert(int from,int to,int v){ e[++num].to=to; e[num].pre=head[from]; e[num].v=v; head[from]=num; } void dfs(int f,int pre){ for(int i=head[f];i;i=e[i].pre){ int v=e[i].to; if(v==pre)continue; dfs(v,f); if(dp[f][1]<dp[v][1]+e[i].v){ dp[f][0]=dp[f][1]; dp[f][1]=dp[v][1]+e[i].v; } else dp[f][0]=max(dp[f][0],dp[v][1]+e[i].v); } ans=max(ans,dp[f][1]+dp[f][0]); } int main(){ scanf("%d",&n); int x,y,z; for(int i=1;i<n;i++){ scanf("%d%d%d",&x,&y,&z); Insert(x,y,z); Insert(y,x,z); } dfs(1,0); printf("%d",ans); }
标签:title log http size head 数据 ++ 树的直径 div
原文地址:http://www.cnblogs.com/thmyl/p/6819436.html