#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 500010
using namespace std;
long long n, s, dis[MAXN], vis[MAXN], now[MAXN];
long long ans, x, y, z, cnt;
struct E {
long long from, to, nxt, vl;
} es[MAXN];
long long read() {
long long f = 1, k = 0 ;
char c = getchar();
while(c > '9' || c < '0') {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(c <= '9' && c >= '0') {
k = k * 10 + c - '0';
c = getchar();
}
return f * k;
}
void addedge(long long a, long long b, long long c) {
es[++cnt].from = a;
es[cnt].to = b;
es[cnt].vl = c;
es[cnt].nxt = now[a];
now[a] = cnt;
}
long long dfs(long long a) {
long long sum = 0, maxx = 0;
vis[a] = 1;
for(int i = now[a]; i != 0; i = es[i].nxt) {
if(!vis[es[i].to]) {
sum ++;
dis[es[i].to] = dis[a] + es[i].vl;
dfs(es[i].to);
if(maxx > dis[es[i].to]) {
ans += maxx - dis[es[i].to];
} else {
if(sum == 1) {
maxx = dis[es[i].to];
} else {
ans += (sum - 1) * (dis[es[i].to] - maxx);
maxx = dis[es[i].to];
}
}
}
}
dis[a] = max(dis[a], maxx);
}
int main() {
n = read();
s = read();
for(int i = 1; i < n; i ++) {
x = read(), y = read(), z = read();
addedge(x, y, z);
addedge(y, x, z);
}
dis[s] = 0;
dfs(s);
printf("%lld", ans);
return 0;
}
luogu 1131
最新推荐文章于 2020-12-23 18:58:06 发布