题目链接:https://www.nowcoder.com/acm/contest/188/C
解题思路:要遍历所有的结点,我们可以按经过的次数把点分成两类:经过一次,经过两次。那么我们可以把所有边的权值加起来然后乘以二,减去从起点出发经过一次的边的权值的总和的最大值就是所求的答案了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50000+10;
struct edg{
int to,cost;
}tem;
vector<edg> node[maxn];
ll dfs(int x,int y){//x表示从点x出发,y表示x是从y到达的
ll mx=0;
//cout<<x<<endl;
for(int i=0;i<node[x].size();i++)
{
ll sum=0;
int j=node[x][i].to;
if(j!=y)//避免往回走
{
sum+=node[x][i].cost;
sum+=dfs(j,x);
}
mx=max(sum,mx);
}
return mx;
}
int main()
{
int n,x,i;
int st,en,wi;
ll sum=0,mx;
cin>>n>>x;
for(i=1;i<n;i++)
{
cin>>st>>en>>wi;
sum+=2*wi;
tem.to=en;
tem.cost=wi;
node[st].push_back(tem);
tem.to=st;
node[en].push_back(tem);
}
mx=dfs(x,x);
printf("%lld\n",sum-mx);
return 0;
}