题意:从起点开始访问所有的节点,要求边权和最小。
分析:可以贪心找到规律,除了从起点到终点一条路径,剩余每条边都访问了两次,所以问题变成了寻找从起点开始的最长路径,答案就是边权和*2-最长路径。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e6+5;
int n;
vector<pair<int,int> > g[N];
ll d[N],ans;
void dfs(int fa,int u) {
ll mx=0;
for(int i=0;i<g[u].size();i++) {
int v=g[u][i].first,w=g[u][i].second;
if(v != fa) {
dfs(u, v);
mx=max(mx,d[v]+w);
}
}
d[u] += mx;
}
int main(){
cin>>n;
for(int i=1;i<n;i++) {
int x,y,w;
cin>>x>>y>>w;
g[x].push_back({y,w});
g[y].push_back({x,w});
ans += 2*w;
}
dfs(-1,1);
cout<<ans-d[1]<<endl;
return 0;
}