题意
给你一棵树(注意读题,无向图且无环),根节点为1,每条边 长为1,从根节点1出发,每到一个结点,等概率的往其子树走,到叶子则终止,同一种状态下走过的节点不再走,求走过的路径长度的期望。
思路
走过的节点不能再次走,由于无环只需要考虑不经过其父亲节点就行,然后深搜子树长度并记录各个节点的子树个数就可以了。
code
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=100000+10;
int n;
vector<int> G[maxn];
double dfs(int u,int root){
double res=0.0;
int cc=0;
for(int i=0;i<G[u].size();i++)
if(G[u][i]!=root) cc++;
if(cc==0) return 0.0;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==root) continue;
res+=dfs(v,u)+1.0;//每次走一步,长度加1
}
return res/cc;//返回期望路径长度
}
int main(){
cin>>n;
for(int i=0;i<n-1;i++){
int u,v;
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
double res=dfs(1,-1);
printf("%.15f\n",res);
return 0;
}
学如逆水行舟,不进则退