题目
链接:https://www.nowcoder.com/acm/contest/188/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
小w不会离散数学,所以她van的图论游戏是送分的
小w有一张n个点n-1条边的无向联通图,每个点编号为1~n,每条边都有一个长度
小w现在在点x上
她想知道从点x出发经过每个点至少一次,最少需要走多少路
输入描述:
第一行两个整数 n,x,代表点数,和小w所处的位置
第二到第n行,每行三个整数 u,v,w,表示u和v之间有一条长为w的道路
输出描述:
一个数表示答案
示例1
输入
复制
3 1
1 2 1
2 3 1
输出
复制
2
备注:
1 ≤ n ≤ 50000 , 1 ≤ w ≤ 2147483647
/*
每条路最多走俩次便可访问全部节点,然后减去由起点可一次dfs最大的路径长度。即为答案,应为这次dfs是可以不用走双的。
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50000 + 10;
int n,x;
struct node
{
int t,w;
node(){}
node(int t,int w):t(t),w(w){}
};
vector<node> g[maxn];
int vis[maxn];
int maxx = INT_MIN;
void dfs(int v, int val)
{
maxx=max(maxx,val);
for(int i=0; i<g[v].size(); i++){
node u = g[v][i];
if(!vis[u.t]){
vis[u.t] = 1;
dfs(u.t, val+u.w);
vis[u.t] = 0;
}
}
}
int main()
{
cin >> n >>x;
int f,t,w;
int ans=0;
for(int i=0; i<n-1; i++)
{
cin >>f>>t>>w;
g[f].push_back(node(t,w));
g[t].push_back(node(f,w));
ans += w;
}
vis[x] = 1;
dfs(x, 0);
cout << ans*2 - maxx <<endl;
return 0;
}