AcWing 1207. 树的直径-模板
原题链接
中等
作者:
W.W
,
2021-03-20 10:56:12
,
所有人可见
,
阅读 587
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
struct node
{
int id, value; //存放该节点指向的结点及权值
};
vector<node> h[N];
int dis[N];
//树的直径:树中长度最长的路径长度
//求法:
// 1.任取一点x
// 2.找到距离x最远的点y
// 3.从y开始遍历,找到离y最远的点,与y最远的点的距离是树的直径
void dfs(int u, int f, int distance) //u为当前结点,f为父节点,distance为当前距离出发点距离
{
dis[u] = distance;
int num = h[u].size();
for(int i=0; i<num; i++)
if(h[u][i].id != f)
dfs(h[u][i].id, u, dis[u]+h[u][i].value);
}
int main()
{
cin>>n;
for(int i=1; i<n; i++)
{
int p, q, d;
scanf("%d%d%d", &p, &q, &d);
h[p].push_back({q,d});
h[q].push_back({p,d});
}
dfs(1, -1, 0);
int u=0; //u存储当前距离x最远的点y
for(int i=1; i<=n; i++)
{
if(dis[i]>dis[u])
u=i;
}
dfs(u, -1, 0);
for(int i=1; i<=n; i++)
{
if(dis[i]>dis[u])
u=i;
}
long long sum = dis[u];
sum = sum*10 + sum*(sum+1)/2;
printf("%lld", sum );
return 0;
}