小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; }