题意就是给你一棵树,算他从根走到叶子的期望
这个题目给了我一个很重的教训,就是我在写这道题的时候把求期望算成了求平均值
然后就没写出来,接着就心态爆炸了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#define maxn 100100
using namespace std;
struct EDGE
{
int st,en,next;
EDGE(){next=-1;}
};
EDGE edge[maxn*2];
int head[maxn],cou,vis[maxn];
double b[maxn];
double ccc,aans;
double dfs(int root,double p)
{
vis[root]=1;
int cou(0);
double ans(0);
for(int k=head[root];k!=-1;k=edge[k].next)
if (!vis[edge[k].en])
cou++;
for(int k=head[root];k!=-1;k=edge[k].next)
if (!vis[edge[k].en])
ans+=dfs(edge[k].en,p/cou);
ans+=p;
if (cou)
return ans;
else {ccc++;return 0;}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
memset(edge,-1,sizeof(edge));
memset(b,0,sizeof(b));
ccc=0;aans=0;
for (int k=1;k<n;k++)
{
int st,en;
scanf("%d %d",&st,&en);
edge[cou].st=st;edge[cou].en=en;
edge[cou].next=head[st];head[st]=cou;
cou++;
edge[cou].st=en;edge[cou].en=st;
edge[cou].next=head[en];head[en]=cou;
cou++;
}
aans=dfs(1,1);
printf("%.8lf\n",aans);
}
return 0;
}