@xiaoziyao
2020-10-29T10:44:03.000000Z
字数 902
阅读 1028
解题报告
有些题解关于排列解释的不清楚(不能保证不存在两种本质相同的排列),这里用一种更简单的方法解释:
考虑一个点什么时候才可以染色:它的所有祖宗结点没有染过色。
由于不在到根节点路径上的点的染色与的染色情况相互独立,所以我们需要染色的概率就是()。
解释一下,我们考虑随机从到根节点的路径上选出一个点,那么选出的概率就是(如果没有选出,那么就不能进行染色)。
因为选择对步数的贡献为,所以对步数期望的贡献为。
根据期望的可加性,因此。
#include<stdio.h>
const int maxn=100005,maxm=200005;
int n,e;
int start[maxn],to[maxm],then[maxm],dep[maxn];
double ans;
inline void add(int x,int y){
then[++e]=start[x],start[x]=e,to[e]=y;
}
void dfs(int x,int last){
dep[x]=dep[last]+1;
for(int i=start[x];i;i=then[i]){
int y=to[i];
if(y==last)
continue;
dfs(y,x);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
}
dfs(1,0);
for(int i=1;i<=n;i++)
ans+=1.0/dep[i];
printf("%.20f\n",ans);
return 0;
}