\(n\)個點的一棵樹,每次選擇乙個沒有染色的點把它和它的子樹染黑,求期望全部染黑的步數。
可以理解為我們按照乙個順序輪流染色,如果乙個點有祖先節點在它前面就不用計算貢獻。
也就是如果乙個點要計算貢獻的概率就是它要排在所有它的祖先節點前面,也就是\(\frac\)。求個和就好了。
時間複雜度\(o(n)\)
#include#include#include#includeusing namespace std;
const int n=1e5+10;
int n;double ans;
vectorg[n];
void dfs(int x,int fa,int dep)
ans+=1.0/(double)dep;
return;
}int main()
dfs(1,0,1);
printf("%.10lf\n",ans);
}