求树的直径要先bfs找到任意起点能走到的最远的点,然后再以找到的点为起点bfs。
本题要求两点遍历树,实际是求两倍权和-树的直径,证明不缀。
//注意拓展点的循环的条件是i != -1还是i != 0.
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 100010;
int n, s, tot, end;
int sum;
int st[maxn], d[maxn], vis[maxn];
struct node{
int to, w, next;
} edge[2*maxn];
void in(int u, int v, int w){
edge[++tot].to = v;
edge[tot].w = w;
edge[tot].next = st[u];
st[u] = tot;
}
int bfs(int start){
memset(vis, 0, sizeof(vis));
d[start] = 0;
int diameter = 0;
queue<int> q;
q.push(start);
vis[start] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = st[u]; i != 0; i = edge[i].next){
int v = edge[i].to;
if(!vis[v]){
d[v] = d[u] + edge[i].w;
if(d[v] > diameter){
diameter = d[v];
end = v;
}
vis[v] = 1;
q.push(v);
}
}
}
return diameter;
}
int main(){
cin >> n >> s;
for(int i = 1, u, v, w; i <= n-1; i++){
cin >> u >> v >> w;
sum += w*2;
in(u, v, w);
in(v, u, w);
}
end = s;
bfs(s);
int dia = bfs(end);
cout << sum - dia << endl;
return 0;
}