链接:https://www.nowcoder.com/acm/contest/188/C
来源:牛客网
小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
分析:题目中的图一定为一棵树。然后放飞想象。。。。。。。。
输出的答案一定为全图权值的两倍再减掉子树的最大权值。。2*sum-ans;
子树的最大权值可用dfs深搜。。
代码:
#include <iostream>
#include <vector>
using namespace std;
typedef long long int ll;
inline ll max(ll a,ll b)
{
return a>b?a:b;
}
struct node
{
int to,dis;
node (int a,int d)//构造函数。。可以用构造函数直接构造出对象进而使用。类也一样
{
to=a,dis=d;
}
};
vector<node> v[50002];
bool vis[50002];
ll ans=0;//注意用长整型
void dfs(int s,ll dis)
{
vis[s]=1;
int size=v[s].size();
if(size==1&&vis[v[s][0].to])// n个点n-1条边一定是树所以一定能进这个if语句ans也一定有值
{
ans=max(ans,dis);
return ;
}
for(int i=0;i<size;i++)
if(!vis[v[s][i].to])
{
dfs(v[s][i].to,v[s][i].dis+dis);
}
}
int main()
{
int n,x;
ll sum=0;
cin>>n>>x;
vis[x]=1;
for(int i=1;i<n;i++)
{
int a,b,dis;
cin>>a>>b>>dis;
v[a].push_back(node(b,dis));
v[b].push_back(node(a,dis));
sum+=dis;
}
dfs(x,0);
cout<<2*sum-ans<<endl;
}