原题: http://codeforces.com/problemset/problem/280/C
题意:
给出一棵树,每次要删除一棵子树,问将树删完的期望步数。
解析:
一个点被删要么删除这个点,要么删除它的一个父亲。若父亲个数为p,那么这个点对答案的贡献步数为 1 p + 1 \dfrac{1}{p+1} p+11。
虽然一条链上的所有点被取到的概率是不同的(父亲取到的概率大一点),但是我们只考虑删除这个点时,那一瞬间的情况。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
vector<int>V[maxn];
double ans=0;
void dfs(int p,int fa,int dep){
ans+=1.0/(1.0*dep);
for(int i=0;i<V[p].size();i++){
int u=V[p][i];
if(u==fa)continue;
dfs(u,p,dep+1);
}
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<n;i++){
int a,b;scanf("%d%d",&a,&b);
V[a].push_back(b);
V[b].push_back(a);
}
dfs(1,-1,1);
printf("%.10f\n",ans);
}