思路: 对于一个父亲的儿子们,有n!种遍历方式,但是根据全排列的概率均匀分布,每一个节点在兄弟节点后面的概率都是1/2 , 那么对于当点的概率 = ans[father]+1+sigma(兄弟节点的个数)/2
#include<bits/stdc++.h>
#define FAST ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef long long ll;
const int MAX_N=1e5+5;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
vector <int> edge[MAX_N];
int cnt[MAX_N];
double ans[MAX_N];
void dfs1(int u){///cul the all node under u
cnt[u]=(int)edge[u].size();
for(int i=0;i<(int)edge[u].size();++i){
int v=edge[u][i];
dfs1(v);
cnt[u]+=cnt[v];
}
}
void dfs2(int u){
for(int i=0;i<(int)edge[u].size();++i){
int v=edge[u][i];
ans[v]=ans[u]+1+1.0*(cnt[u]-cnt[v]-1)/2;
dfs2(v);
}
}
int main(void){
int n;
cin >> n;
for(int i=2;i<=n;i++){
int v;
scanf("%d",&v);
edge[v].push_back(i);
}
dfs1(1);
ans[1]=1;
dfs2(1);
for(int i=1;i<=n;i++)
printf("%.8f ",ans[i]);
}