题意:
给定一棵有n个节点的树,两人骑着一匹马等概率走向任意相连的未经过的节点,从1号点开始旅行,当到某个点的无法移动时旅行结束。求期望的旅行长度(每条边的长度为1)。
思路:
遍历树即可,当到达叶节点即不可移动的点时,ans+=走这条路径的概率*该路径造成的路程。不是数学那种平均期望,也不能在未到终点的时候求当前路径的期望值(概率*路程)。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e5+5;
const double eps = 1e-9;
struct node
{
int v, next;
}edge[maxn*2];
int no, head[maxn];
int n;
double ans;
void init()
{
no = 0;
memset(head, -1, sizeof head);
}
void add(int u, int v)
{
edge[no].v = v;
edge[no].next = head[u];
head[u] = no++;
}
void dfs(int u, int father, double val, double bas)
{
int flag = 1, cnt = 0;
for(int k = head[u]; k != -1; k = edge[k].next)
{
int v = edge[k].v;
if(v == father) continue;
++cnt;
}
for(int k = head[u]; k != -1; k = edge[k].next)
{
int v = edge[k].v;
if(v == father) continue;
flag = 0;
dfs(v, u, val+1.0, bas/cnt);
}
if(flag) ans += val*bas;
}
int main()
{
scanf("%d", &n); init();
for(int i = 1; i < n; ++i)
{
int u, v;
scanf("%d %d", &u, &v);
add(u, v); add(v, u);
}
ans = 0.0;
dfs(1, -1, 0, 1);
printf("%.10f\n", ans+eps);
return 0;
}
继续加油~
版权声明:本文为yo_bc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。