题面:https://www.luogu.org/problemnew/show/CF280C
//Pro:CF280C Game on Tree //因为树全被染成黑色了,所以根节点一定被染了 //那么就是求从x染到根节点的操作数的期望 //考虑x被染黑的情况 //1、根节点(x的最高祖先)被染黑 //2、根节点的某个儿子(x的次高祖先)被染黑 //...... //dep[x]-1、x的父亲被染黑 //dep[x]、 x被染黑 //所以节点x被染黑的可能情况有dep[x]种 //用P(x)表示直接把x染黑的概率 //那么P(x)=1/dep[x] //所以我们要算的就是sigma(1/dep[x]) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e5+5; int n; int head[N],num_edge; struct Edge { int v,nxt; }edge[N<<1]; inline void add_edge(int u,int v) { edge[++num_edge].v=v; edge[num_edge].nxt=head[u]; head[u]=num_edge; } int dep[N]; void dfs(int u,int fa) { for(int i=head[u],v;i;i=edge[i].nxt) { v=edge[i].v; if(v==fa) continue; dep[v]=dep[u]+1; dfs(v,u); } } double ans; int main() { scanf("%d",&n); for(int i=1,u,v;i<n;++i) { scanf("%d%d",&u,&v); add_edge(u,v); add_edge(v,u); } dep[1]=1; dfs(1,0); for(int i=1;i<=n;++i) ans+=1.0/dep[i]; printf("%.7lf",ans); return 0; }