CF696B Puzzles 题解
前置知识
解法
目前在 \(fa\) 节点时,搜到子节点 \(x\) 和其他子节点的概率是相等的(因为不需要管具体是哪个节点),均为 \(\frac{1}{2}\)。
设 \(f_{x}\) 表示 \(x\) 时间戳的期望值,状态转移方程为 \(f_{x}=1+f_{fa}+\frac{siz_{fa}-1-siz_{x}}{2}\),边界为 \(f_{1}=1\)。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
struct node
{
int nxt,to;
}e[100010];
int head[100010],siz[100010],cnt=0;
double f[100010];
void add(int u,int v)
{
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs(int x)
{
siz[x]=1;
for(int i=head[x];i!=0;i=e[i].nxt)
{
dfs(e[i].to);
siz[x]+=siz[e[i].to];
}
}
void reroot(int x)
{
for(int i=head[x];i!=0;i=e[i].nxt)
{
f[e[i].to]=1+f[x]+(siz[x]-1-siz[e[i].to])/2.0;
reroot(e[i].to);
}
}
int main()
{
int n,u,v,i;
cin>>n;
for(i=2;i<=n;i++)
{
cin>>u;
v=i;
add(u,v);
}
dfs(1);
f[1]=1;
reroot(1);
for(i=1;i<=n;i++)
{
printf("%.6lf ",f[i]);
}
return 0;
}
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18273947,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。