小A与欧拉路
小A与欧拉路
https://ac.nowcoder.com/acm/problem/22618
分析
我们对于不定根的树形结构的题目,我们首先应该考虑定根考虑。考虑从节点 出发。那么我们得到的最短的欧拉路一定是
,考虑到每次走完一个子树都必须回到自身,除了最后一次。所以我们在定根之后,就是要选取
。那么我们只要取所有节点作为根的最大值。结合定义可以发现我们就是要求,树上的一条最长路径
。其实也就是直径,找个树的直径的做法就过了。
代码
#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;
}