题目:树的直径
算法流程:
令表示经过的最长链,表示以为根的子树能到达的最远点之间距离,明显有:
其中分别为的儿子。
如果经过的最长链是往父亲延申的呢?那会在其父亲算到。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=100010;
int n,m,size,ans;
int first[Max],f[Max],d[Max];
struct shu{int to,next,len;}edge[Max<<1];
inline int get_int()
{
int x=0,f=1;char c;
for(c=getchar();(!isdigit(c))&&(c!='-');c=getchar());
if(c=='-') f=-1,c=getchar();
for(;isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+c-'0';
return x*f;
}
inline void build(int x,int y,int z){edge[++size].next=first[x],first[x]=size,edge[size].to=y,edge[size].len=z;}
inline void dfs(int p,int fa)
{
for(int u=first[p];u;u=edge[u].next)
{
int to=edge[u].to;
if(to==fa) continue;
dfs(to,p);
f[p]=max(f[p],d[p]+edge[u].len+d[to]);
d[p]=max(d[p],edge[u].len+d[to]);
}
}
int main()
{
n=get_int();
for(int i=1;i<n;i++)
{
int x=get_int(),y=get_int(),z=get_int();
build(x,y,z),build(y,x,z);
}
dfs(1,0);
for(int i=1;i<=n;i++) ans=max(ans,f[i]);
cout<<ans;
return 0;
}