传送门

首先,一定要把所有点遍历一遍,这时答案应该是\(\frac{\sum 某个点第一次被遍历的时间点}{n-1}\quad\),而且每条边只能走两次,所以每次要遍历完某棵子树才能遍历其它子树。

考虑每次先递归处理子树,记\(f_x=\sum x子树内某个点第一次被遍历的时间点,g_x=w_{x,fa_x}+\sum x 子树内边权\)

显然\(g_x=\sum_{y是x的儿子\quad}g_y\) ; \(f_x\)的话,因为要将儿子以一定顺序遍历,因此某个儿子的贡献应该是\(f_y+sz_y*(w_{(x,y)}+pre)(pre=\sum前面的g_y*2)\)

我们要使得答案最小,先考虑只有两个儿子\(a,b\),如果儿子\(a\)在前面,$$f_x=f_a+sz_aw_{(x,a)}+f_b+sz_b(w_{(x,b)}+g_a2)$$,如果是\(b\)在前,则为$$f_x=f_b+sz_bw_{(x,b)}+f_a+sz_a(w_{(x,a)}+g_b2)$$现在如果\(a\)在前面答案更小,则$$f_a+sz_aw_{(x,a)}+f_b+sz_b(w_{(x,b)}+g_a2)<f_b+sz_bw_{(x,b)}+f_a+sz_a(w_{(x,a)}+g_b2)$$$$sz_aw_{(x,a)}+sz_b(w_{(x,b)}+g_a2)<sz_bw_{(x,b)}+sz_a(w_{(x,a)}+g_b2)$$$$sz_bg_a2<sz_ag_b2$$$$\frac{g_a}{sz_a}<\frac{g_b}{sz_b}$$

然后进行推广,把上式作为排序优先级,排序后做就能得出最终答案了

#include<bits/stdc++.h>
#define il inline
#define re register
#define LL long long
#define db double
#define eps (1e-7) using namespace std;
const int N=500000+10;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
db w[N<<1];
int to[N<<1],nt[N<<1],hd[N],tot=1;
il void add(int x,int y,int z)
{
++tot,to[tot]=y,nt[tot]=hd[x],w[tot]=z,hd[x]=tot;
++tot,to[tot]=x,nt[tot]=hd[y],w[tot]=z,hd[y]=tot;
}
int n;
struct nn
{
db x,y,z;
bool operator < (const nn &bb) const {return z/y!=bb.z/bb.y?z/y<bb.z/bb.y:z<bb.z;}
}st[N];
db f[N],g[N],sz[N];
void dfs(int x,int ffa)
{
sz[x]=1;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
dfs(y,x);
sz[x]+=sz[y];
}
int tt=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y==ffa) continue;
st[++tt]=(nn){f[y]+sz[y]*w[i],sz[y],g[y]+w[i]};
}
sort(st+1,st+tt+1);
for(int i=1;i<=tt;i++)
{
f[x]+=st[i].x+st[i].y*g[x]*2;
g[x]+=st[i].z;
}
} int main()
{
n=rd();
for(int i=1;i<n;i++)
{
int x=rd(),y=rd(),z=rd();
add(x,y,z);
}
dfs(1,0);
printf("%.8lf\n",f[1]/(db)(n-1));
return 0;
}

CF101D Castle的更多相关文章

  1. 题解-CF101D Castle

    题面 CF101D Castle 给一棵 \(n\) 个节点的带权树,求一种遍历方案,从 \(1\) 出发,每条边走两次,走过所有点,第一次经过每个节点的平均时间最小.输出这个平均时间. 数据范围:\ ...

  2. CF101D Castle 树形DP、贪心

    题目传送门 题意:给出一个有$N$个点的树,你最开始在$1$号点,经过第$i$条边需要花费$w_i$的时间.每条边只能被经过$2$次.求出到达除$1$号点外所有点的最早时间的最小平均值.$N \leq ...

  3. Castle Core 4.0.0 alpha001发布

    时隔一年多以后Castle 项目又开始活跃,最近刚发布了Castle Core 4.0.0 的alpha版本, https://github.com/castleproject/Core/releas ...

  4. 对Castle Windsor的Resolve方法的解析时new对象的探讨

    依赖注入框架Castle Windsor从容器里解析一个实例时(也就是调用Resolve方法),是通过调用待解析对象的构造函数new一个对象并返回,那么问题是:它是调用哪个构造函数呢? 无参的构造函数 ...

  5. AOP之Castle DynamicProxy 动态代理

    这里主要介绍使用castle这个动态代理,在.net一些开源的框架里可以找到它的影子,就连微软的rchard也是使用这个进行方法拦截等可以基于这个进行方法拦截,在这个方面PostSharp算是比较好用 ...

  6. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...

  7. MVC Castle依赖注入实现代码

    1.MVc 实现依赖注入 public class WindsorControllerFactory : DefaultControllerFactory { private readonly IKe ...

  8. 避免Castle Windsor引起的内存泄露

    原文地址: http://nexussharp.wordpress.com/2012/04/21/castle-windsor-avoid-memory-leaks-by-learning-the-u ...

  9. Castle中AdditionalInterfaces用法介绍

    首先见下图(图一),其中FooController是一个没有实现任何Interface的空类.需要实现的效果是:通过FooController对象调用FooService的Do方法.设置这一不常见的场 ...

随机推荐

  1. Lodop调整打印项输出顺序 覆盖与层级

    Lodop中的打印项,如果有输出在同一位置,或部分位置重叠的地方,打印项之间是怎么覆盖的呢?在JS里,按照Lodop语句打印项先后的执行顺序,先执行的先输出,后执行的后输出,如果有后面的打印项和前面的 ...

  2. C-Lodop回调函数的触发

    高版本的火狐和谷歌不再支持np插件之后,Lodop公司推出了C-Lodop,解决了这些浏览器不能用Lodop插件方式打印的问题,相比较Lodop插件,C-Lodop由于是以服务的形式出现,返回值不能直 ...

  3. 【转】Caffe的solver文件配置

    http://blog.csdn.net/czp0322/article/details/52161759 solver.prototxt 今天在做FCN实验的时候,发现solver.prototxt ...

  4. semantic segmentation with deeplearning

    a 2017 guide to semantic segmentation with deep learning paper: http://blog.qure.ai/notes/semantic-s ...

  5. JavaScript限制前端页面用户表单输入

    onkeyup事件 onkeyup 事件会在键盘按键被松开时发生. 内容来源:自成e家 1.只能输入数字 <input onkeyup = "value=value.replace(/ ...

  6. python成长之路五-文件操作

    1,文件操作 f = open("D:\种子.txt",encoding="utf-8",mode="r") # 打开一个种子.txt文件, ...

  7. [luogu4551][POJ3764]最长异或路径

    题目描述 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 分析 处理出各个节点到根节点的异或距离,然后我 ...

  8. [poj2528]Mayor's posters

    题目描述 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campa ...

  9. emwin之窗口关闭按钮用法

    @2018-07-27 [小记] 使用函数 FRAMEWIN_AddCloseButton() 实现关闭当前窗口的功能时,调用其窗口的父窗口必须处于打开状态,否则将导致假死(当前窗口死了,系统还在工作 ...

  10. luogu4267 TamingtheHerd (dp)

    设f[i][j]为让前i天发生j次暴动需要改变的最少的值 则f[i][j]=min{f[k][j-1]+(x[k+1]!=0)+(x[k+2]!=1)+...+(x[i]!=(i-k-1))} $O( ...