1. 程式人生 > 其它 >CF280C # Game on Tree 期望的可加性

CF280C # Game on Tree 期望的可加性

CF280C # Game on Tree 期望的可加性

期望

CF280C Game on Tree

題目描述

給定一棵有根樹,結點編號從1到n。根結點為1號結點。

對於每一次操作,等概率的選擇一個尚未被刪去的結點並將它及其子樹全部刪去。當所有結點被刪除之後,遊戲結束;也就是說,刪除1號結點後遊戲即結束。

要求求出刪除所有結點的期望操作次數。

我們可以發現本題求的是刪除總次數的期望,而根本無法直接求出,簡單轉換為求出每一個點的期望選擇次數並且累和,即:

\[del(all \space tree)= \sum_{i=1}^{n} P(i) \]

我們可以想象成無論一個點是否刪除它都存在在一個包含了所以點的序列上,所以一個點被刪除當且僅當它在所以他的祖先節點後面,所以選擇成功的概率為$ \frac{1}{dep(i)}\qquad $

所以我們可以簡單搞定了:

\(cose:\)

#include<bits/stdc++.h>
#define ll long long
#define fd(i, a, b) for (ll i = a; i >= b; i--)
#define r(i, a) for (ll i = fir[a]; i; i = e[i].nex)
#define file(a) freopen(#a ".in", "r", stdin);freopen(#a ".out", "w", stdout);
#define il inline
#define gc getchar()
#define f(i,a,b) for(ll i=a;i<=b;i++)
using namespace std;
const ll maxn=1e5+10,INF=1e16;
il ll read(){
    ll x=0,f=1;char ch=gc;
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc;}
    while(ch>='0'&&ch<='9') x=(x*10)+(ch^48),ch=gc;
    return x*f;
}
ll dep[maxn],n;
vector<ll> e[maxn];
il void add(ll a,ll b){e[a].push_back(b);}
il void dfs(ll v,ll f){
	dep[v]=dep[f]+1;
	f(i,0,e[v].size()-1){
		ll t=e[v][i];
		if(t==f) continue;
		dfs(t,v);
	}
}
double ans;
int main()
{
	n=read();
	f(i,2,n){ll a=read(),b=read();add(a,b);add(b,a);}
	dfs(1,0);
	f(i,1,n) ans+=(1.0/double(dep[i]));
	printf("%.10lf",ans);
}