CF280C Game on Tree

题面: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;
}

猜你喜欢

转载自www.cnblogs.com/lovewhy/p/9251049.html