CodeForces 101D Castle (贪心)

来源:互联网 发布:java 数组长度动态 编辑:程序博客网 时间:2024/05/16 23:51
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>using namespace std;#define N 400020#define M 200020int fst[N], 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[N], sz[N];int val[N];vector<int> son[N];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;}

0 0
原创粉丝点击