luogu 1131

来源:互联网 发布:windows快速打开程序 编辑:程序博客网 时间:2024/06/11 09:26
#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 500010using 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;}
原创粉丝点击