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; }
相关文章推荐
- android studio基本界面设置
- CrackingtheCodeInterview之链表
- 团体程序设计天梯赛-练习集L1-010. 比较大小
- HTML表单验证库SMValidator
- SQL中distinct的用法(转)
- REST API (更新文档)
- Error retrieving parent for item: No resource found that
- [extjs(2)] extjs第一个组件treepanel
- go的markdown解析库和session库
- 团体程序设计天梯赛-练习集L1-009. *N个数求和
- 【GOF23设计模式】_观察者模式_广播机制_消息订阅_网络游戏对战原理_自带类与接口JAVA251-252
- 打印1到最大的n位数
- 【EF】浅谈EF
- 视频会议及流媒体十大开源项目
- js undefined、null和NaN
- 自己写库—构建库函数雏形
- Scala入门学习笔记四--List使用
- 现在输入n个数字,以逗号分开,然后可选择升或者降序排序,按提交键在另一个页面显示
- ubuntu下golang环境配置
- LDA相关论文汇总