AcWing 1207 大臣的旅费
国家的地图是一棵树, 大臣想找的最远的路就是树的直径,所以这一题就是找到树的直径。方法:先随便找到一个点x(代码中是根节点),然后找到距离x最远的点p, 之后找到距离p最远的点y, py的距离就是树的直径,证明如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
struct Node{ //结构体边
int ne, r;
};
int n;
vector<Node>ve[N];
int dis[N];
void dfs(int u, int father, int di){
dis[u] = di;
for(auto op : ve[u]){
if(op.ne != father){
dfs(op.ne, u, di + op.r);
}
}
}
signed main()
{
cin>>n;
for(int i = 1; i < n; i ++ ){
int a, b, c;
cin>>a>>b>>c;
ve[a].push_back({b, c});
ve[b].push_back({a, c});
}
dfs(1, -1, 0);
int u = 1;
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;
}
}
int s = dis[u];
cout<<10 * s + s * (s + 1) / 2<<endl;
return 0;
}