Luo Gu P2052 [NOI2011] road construction

Luo Gu P2052 [NOI2011] road construction

topic:

  • There are pictures. Turn link

answer:

  • Though this is the NOI, but to comment too blue title bar ... malicious ...
  • A simple search? ? It is to find sub-tree size is OK ...
  • Tucao: Today Team %%% Lord left to a question which, as a game. Then this question when I only took 55pts. A Los valley on the. God bother
#include <iostream>
#include <cstdio>
#include <cmath>
#define N 1000005
#define LL long long
using namespace std;

struct E {LL next, to, dis;} e[N * 2];
LL n, num, ans;
LL h[N], size[N];

LL read() {
    LL x = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
    return x;
}

void add(LL u, LL v, LL w) {
    e[++num].next = h[u];
    e[num].to = v;
    e[num].dis = w;
    h[u] = num;
}

void dfs(LL x, LL fat) {
    size[x]++;
    for (LL i = h[x]; i != 0; i = e[i].next)
        if (e[i].to != fat) {
            dfs(e[i].to, x);
            size[x] += size[e[i].to];
        } 
}

void dfss(LL x, LL fat) {
    for (LL i = h[x]; i != 0; i = e[i].next)
        if (e[i].to != fat) {
            LL y = e[i].to;
            ans += e[i].dis * abs(size[y] - (size[1] - size[y]));
            dfss(e[i].to, x);
        }
}

int main() {
    cin >> n;
    for (LL i = 1; i < n; i++) {
        LL u = read(), v = read(), w = read();
        add(u, v, w);
        add(v, u, w);
    }
    dfs(1, 0);
    dfss(1, 0);
    cout << ans;
    return 0;
}

Guess you like

Origin www.cnblogs.com/BigYellowDog/p/11246379.html