//这里填你的代码^^
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=100010;
int n;
struct edge
{
int id,w;
};
vector<edge> h[N]; // 存储图的邻接表
int dist[N]; // 存储节点到根节点的距离
void dfs(int u,int father,int distance)
{
dist[u]=distance; // 记录当前节点到根节点的距离
for(auto node:h[u])
if(node.id!=father) // 遍历当前节点的相邻节点,避免回头访问父节点
dfs(node.id,u,distance+node.w); // 递归遍历每个相邻节点
}
int main()
{
cin>>n; // 输入节点数
for(int i=0;i<n-1;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c); // 输入边的起点、终点和权值
h[a].push_back({b,c}); // 将边加入起点的邻接表
h[b].push_back({a,c}); // 将边加入终点的邻接表(无向图)
}
dfs(1,-1,0); // 从根节点开始深度优先搜索,标记每个节点到根节点的距离
int u=1;
for(int i=1;i<=n;i++)
{
if(dist[i]>dist[u]) // 找到距离根节点最远的节点
u=i;
}
dfs(u,-1,0); // 以距离根节点最远的节点为新的根节点,重新进行深度优先搜索
for(int i=1;i<=n;i++)
if(dist[i]>dist[u]) // 找到新根节点下的距离最远的节点
u=i;
int s=dist[u]; // 最远距离
printf("%lld\n",s*10+s*(s+1ll)/2); // 输出结果
return 0;
}
//注意代码要放在两组三个点之间,才可以正确显示代码高亮哦~
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=400010;
typedef long long ll;
int h[N],e[M],ne[M],w[M],idx;
int n,dist[N],st[N];
void add(int a,int b,int d)
{
e[idx]=b,ne[idx]=h[a],w[idx]=d,h[a]=idx++;
}
void dfs(int u,int father,int dis)
{
dist[u]=dis;
for(int i=h[u];i!=-1;i=ne[i])
{
int b=e[i];
if(b!=father)//避免回头
{
dfs(b,u,dis+w[i]);
}
}
}
int main()
{
cin>>n;
memset(h,-1,sizeof h);
for(int i=1;i<n;i++)
{
int a,b,d;
cin>>a>>b>>d;
add(a,b,d),add(b,a,d);//无向图
}
dfs(1,-1,0);
int u=1;
for(int i=2;i<=n;i++)
if(dist[i]>dist[u]) u=i;
dfs(u,-1,0);
u=1;
for(int i=2;i<=n;i++)
if(dist[i]>dist[u]) u=i;
int s=dist[u];
printf("%lld\n",s*10+s*(s+1ll)/2);
return 0;
}