1.DP求树的直径
void dfs(int u)
{
// dp[i]表示以i为根的最长树链
vis[u] = 1;
for(int i = head[u] ; i != -1 ; i = edge[i].next)
{
int v = edge[i].t;
if(!vis[v])
{
dfs(v);
//当前节点的最大树链长度+儿子节点的最长树链长度+两点间的距离构成的长度的最大值为树的直径
len = max(len,dp[u] + dp[v] + edge[i].w);
//更新以u为根节点的最长链长
dp[u] = max(dp[u], dp[v] + edge[i].w);
}
}
}
2.两次BFS求直径
1.随便找一个节点作为根,BFS求出其他点离根的距离,选出最大值,作为第二次BFS的根,求的的最大值即为直径(只适用与权为正的情况)