Codeforces 280C Game on tree (期望线性性)
题目大意:给你一棵树,1号节点是根,每次等概率选择没有被染黑的一个节点染黑其所有子树中的节点,问染黑所有节点的期望次数
然后这个题一样看过去就是期望DP
因为期望的线性性,我们可以分别考虑每一个节点被染黑的期望次数
如果他的某一个祖先被然黑了,那他也会被染黑,也即使他的操作数就是0,所以说,这个点的只有当选他本身的时候,
才会有操作数,其期望为 1/dep[i]
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 100010 4 int n,tot=0,head[N]= {0}; 5 struct Edge 6 { 7 int v,nxt; 8 } E[N<<1]; 9 void add(int u,int v) 10 { 11 E[++tot]=(Edge) 12 { 13 v,head[u] 14 }; 15 head[u]=tot; 16 } 17 int dep[N]= {0}; 18 void dfs(int u,int fa) 19 { 20 dep[u]=dep[fa]+1; 21 for(int i=head[u]; i; i=E[i].nxt) 22 { 23 int v=E[i].v; 24 if(v==fa)continue; 25 dfs(v,u); 26 } 27 } 28 int main() 29 { 30 scanf("%d",&n); 31 for(int i=1; i<n; i++) 32 { 33 int u,v; 34 scanf("%d%d",&u,&v); 35 add(u,v); 36 add(v,u); 37 } 38 dfs(1,0); 39 double ans=0; 40 for(int i=1; i<=n; i++)ans+=1.0/(double)dep[i]; 41 printf("%lf",ans); 42 return 0; 43 }