题目链接:水图
我们不难想到,我们走到最后一个点之后不用走回来。
所以如果我们需要走回来,那么答案就是所有边的二倍权值和,但是现在我们不需要走回来。
所以我们就是要不走回来的权值和最大,也就是以x为起点的直径。
直接dfs或者bfs即可。
AC代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,x,res,mx;
vector<int> v1[N],v2[N];
inline void add(int a,int b,int c){v1[a].push_back(b),v2[a].push_back(c);}
void dfs(int x,int fa,int d){
if(d>mx) mx=d;
for(int i=0;i<v1[x].size();i++){
int w=v2[x][i],to=v1[x][i];
if(to==fa) continue;
dfs(to,x,d+w);
}
}
signed main(){
cin>>n>>x;
for(int i=1,a,b,c;i<n;i++)
cin>>a>>b>>c,add(a,b,c),add(b,a,c),res+=(c<<1);
dfs(x,x,0);
cout<<res-mx<<endl;
return 0;
}