二刷提高课,题解目录在这里— 提高课的题解目录
求树的直径,我们可以随便选取一个点,找到距离此点最远的,然后用这个点遍历最远的即是直径
但是这里用树形DP(最大值与次大值)来写
注意这里边权可以为负,但是可以只有一个点所以最小也是0
若想仔细了解一下可以看这个 树的三大核心
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e4+10,M=2*N;
int h[N],ne[M],de[M],w[M];
int n,res,dix;
void add(int a,int b,int c)
{
de[dix]=b,ne[dix]=h[a],h[a]=dix,w[dix++]=c;
}
int dfs(int u,int f)
{
int d1=0,d2=0;
for(int i=h[u];~i;i=ne[i])
{
int j=de[i];
if(j==f)continue;
int t=dfs(j,u)+w[i];
if(d1<t)d2=d1,d1=t;
else if(d2<t)d2=t;
}
res=max(res,d1+d2);
return d1;
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
dfs(1,-1);
cout<<res;
}