树的直径
代码如下:
#include<iostream>
#include <vector>
using namespace std;
#define N 10005
#define INF 1e8
int n;
vector<int>G[N];
int d[N][N],dp[N],fa[N];//权值,最长链,父节点
int ans=0,node;
void dfs(int u,int p)
{
int v,i;
dp[u]=0;
for(i=0;i<G[u].size();i++)
{
v=G[u][i];
if(v!=p)
{
dfs(v,u);
ans=max(ans,dp[u]+d[v][u]+dp[v]);
dp[u]=max(dp[u],dp[v]+d[v][u]);
/*这里要注意ans和dp的更新顺序,先更新目前最长的链,
再更新需要进行递归的dp,这里的dp和ans都是“最长链”,
ans是当前节点加上一条或两条子树的最长链,不参与父节点的
链长计算,而dp是包括当前节点和其中一条子树链的长度*/
}
}
}
int main()
{
while(cin>>n)
{
int a,b,c,i;
ans=0;
for(i=0;i<=n;i++) G[i].clear() ;
for(i=1;i<n;i++)
{
cin>>a>>b>>c;
G[a].push_back(b);
G[]
d[b]=c;
}
//建立一棵树,a代表父节点,b代表子树,c为权值
int root=3;
while(fa[root]) root=fa[root];//找根节点
dfs(root,0);
cout<<ans<<endl;
}
return 0;
}