树的直径
U81904 【模板】树的直径
题目描述
给定一棵树,树中每条边都有一个权值,
树中两点之间的距离定义为连接两点的路径边权之和。
树中最远的两个节点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链。
现在让你求出树的最长链的距离
输入格式
给定一棵无根树
第一行为一个正整数\(n\),表示这颗树有\(n\)个节点
接下来的\(n-1\)行,每行三个正整数\(u,v,w\),表示\(u,v(u,v<=n\))有一条权值为\(w\)的边相连
数据保证没有重边或自环
输出格式
输入仅一行,表示树的最长链的距离
输入
6
1 2 1
1 3 2
2 4 3
4 5 1
3 6 2
输出
9
说明/提示
对于\(10\%\)的数据 \(n<=10\)
对于\(30\%\)的数据 \(n<=1000\)
对于\(50\%\)的数据 \(n<=10000\)
对于\(70\%\)的数据 \(n<=100000\) 边权均为正整数
对于\(100\%\)的数据 \(n<=500000\) 边权可能为负
- 时间复杂度:\(O(n)\)
代码
#include
using namespace std;
const int N=5e5;
int n,u,v,w,res=-0x3f3f3f3f;
int d[N];
bool vis[N];
vector> adj[N];
void dp(int x,int fa)
{
for(auto [y,w]:adj[x])
{
if(y==fa)continue;
dp(y,x);
res=max(res,d[x]+d[y]+w);
d[x]=max(d[x],d[y]+w);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i