您的位置:首页 > 其它

CodeForces 101D Castle (贪心)

2016-07-02 16:35 435 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;

#define N 400020
#define M 200020

int fst
, nxt[M], vv[M], cost[M], e;

void init() {
memset(fst, -1, sizeof fst);
e = 0;
}
void add(int u, int v, int c) {
vv[e] = v, cost[e] = c, nxt[e] = fst[u], fst[u] = e++;
}
int n, w
, sz
;
int val
;
vector<int> son
;

double ans;

void dfs(int u, int p) {
sz[u] = 1;
w[u] = 0;
for(int i = fst[u]; ~i; i = nxt[i]) {
int v = vv[i];
int c = cost[i];
if(v == p) continue;
dfs(v, u);
son[u].push_back(v);
sz[u] += sz[v];

val[v] = c;
w[v] += c;
w[u] += w[v];
}
}
bool cmp(int i, int j) {
return 1LL * w[i] * sz[j] < 1LL * w[j] * sz[i];
}
void dfs2(int u, int p) {
int cnt = 0;
for(int i = 0; i < son[u].size(); ++i) {
int v = son[u][i];
cnt += sz[v];
ans += sz[v] * val[v];
ans += 1LL * (sz[u] - cnt - 1) * w[v] * 2;
dfs2(v, u);
}
}

int main() {
scanf("%d", &n);
init();
for(int i = 1; i < n; ++i) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
add(u, v, c);
add(v, u, c);
}
dfs(1, -1);
for(int i = 1; i <= n; ++i) {
sort(son[i].begin(), son[i].end(), cmp);
}
dfs2(1, -1);
printf("%.12lf\n", ans / (n - 1));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: