发现一个点, 如果选它的子树, 它的其他兄弟, 对它都没有影响, 该选的还是要选
唯一有影响的就是它的祖先, 如果它的祖先选了, 它就可以不用选了
考虑一个点在它祖先之前选到的概率, 总共 dep[i] 个节点, 全排列就是 dep[i] !
第一个点固定是 i, 后面还有 (dep[i]-1)!, 所以概率应该 1 / dep[i]
所以一个点只有 1/dep[i] 的概率对答案有 1 的贡献, 期望也是 1 / dep[i], 把所有点的加起来就可以了
#include<bits/stdc++.h>
#define N 200050
using namespace std;
int n, dep[N], first[N], nxt[N], to[N], tot; double ans;
void add(int x, int y){nxt[++tot] = first[x], first[x] = tot, to[tot] = y;}
void dfs(int u, int fa){
for(int i=first[u];i;i=nxt[i]){
int t = to[i]; if(t == fa) continue;
dep[t] = dep[u] + 1; ans += 1.0 / dep[t]; dfs(t, u);
}
}
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);
} dep[1] = 1; dfs(1, 0);
printf("%.8lf", ans + 1); return 0;
}