题目链接:水图


我们不难想到,我们走到最后一个点之后不用走回来。

所以如果我们需要走回来,那么答案就是所有边的二倍权值和,但是现在我们不需要走回来。

所以我们就是要不走回来的权值和最大,也就是以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;
}