[关闭]
@xiaoziyao 2020-10-29T02:44:03.000000Z 字数 902 阅读 863

CF280C Game on Tree解题报告

解题报告


CF280C Game on Tree

更好的阅读体验

题意

分析

有些题解关于排列解释的不清楚(不能保证不存在两种本质相同的排列),这里用一种更简单的方法解释:

考虑一个点什么时候才可以染色:它的所有祖宗结点没有染过色。

由于不在到根节点路径上的点的染色与的染色情况相互独立,所以我们需要染色的概率就是)。

解释一下,我们考虑随机从到根节点的路径上选出一个点,那么选出的概率就是(如果没有选出,那么就不能进行染色)。

因为选择对步数的贡献为,所以对步数期望的贡献为

根据期望的可加性,因此

代码

  1. #include<stdio.h>
  2. const int maxn=100005,maxm=200005;
  3. int n,e;
  4. int start[maxn],to[maxm],then[maxm],dep[maxn];
  5. double ans;
  6. inline void add(int x,int y){
  7. then[++e]=start[x],start[x]=e,to[e]=y;
  8. }
  9. void dfs(int x,int last){
  10. dep[x]=dep[last]+1;
  11. for(int i=start[x];i;i=then[i]){
  12. int y=to[i];
  13. if(y==last)
  14. continue;
  15. dfs(y,x);
  16. }
  17. }
  18. int main(){
  19. scanf("%d",&n);
  20. for(int i=1;i<n;i++){
  21. int x,y;
  22. scanf("%d%d",&x,&y);
  23. add(x,y),add(y,x);
  24. }
  25. dfs(1,0);
  26. for(int i=1;i<=n;i++)
  27. ans+=1.0/dep[i];
  28. printf("%.20f\n",ans);
  29. return 0;
  30. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注