分析

我们对于不定根的树形结构的题目,我们首先应该考虑定根考虑。考虑从节点 出发。那么我们得到的最短的欧拉路一定是 ,考虑到每次走完一个子树都必须回到自身,除了最后一次。所以我们在定根之后,就是要选取 。那么我们只要取所有节点作为根的最大值。结合定义可以发现我们就是要求,树上的一条最长路径 。其实也就是直径,找个树的直径的做法就过了。

代码

#include<bits/stdc++.h>
using namespace std;
#define pi pair<int,int>
const int N = 2e5 + 100;
vector<pi> G[N];int n,f[N],ans,s;
void dfs(int x,int fa) {
    for(auto e : G[x]) {
        int y = e.first,w = e.second;
        if(y == fa) continue;
        dfs(y,x);
        ans = max(f[x] + f[y] + w,ans);
        f[x] = max(f[x],f[y] + w);
    }
}
int main() {
    scanf("%d",&n);
    for(int a,b,c,i = 1;i < n;i++) {
        scanf("%d%d%d",&a,&b,&c);
        G[a].push_back(pi(b,c));
        G[b].push_back(pi(a,c));
        s += 2 * c;
    }
    dfs(1,0);printf("%d\n",s - ans);
    return 0;
}