洛谷 P2052 [NOI2011]道路修建
题目:
题解:
虽说是NOI,但是评成蓝题也太恶意了吧… …- 一个简单的搜索??就是找出子树大小就OK了…
- 吐槽:今天集训队爷%%%留下来的其中一道题,当作比赛的。然后这题当时我只拿了55pts。洛谷就A了。神烦
#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;
}