题目链接:http://codeforces.com/contest/839/problem/C
【中文题意】有n个城市,n-1条边(保证图连通),从1城市出发,走过的城市不可以再走,每两个城市之间的距离为1,走过的城市不可以再走,求出走过的距离的期望值。
【思路分析】首先就是期望值,期望值为每个距离乘以其概率,然后相加。然后我们就可以从城市1开始dfs,dfs到叶子节点的时候加上距离乘以期望值,这里为了减少精度损失,我dfs时候记录的为概率的倒数。
【AC代码】
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<set>
using namespace std;
#define LL long long
const int maxn = 100000 + 10;
int n;
vector<int>G[maxn];
bool book[maxn];
double sum = 0;
void dfs(int u,int len,double s)
{
int nn=G[u].size();
int cnt=0;
for(int i=0;i<nn;i++)
{
int v=G[u][i];
if(!book[v])
{
cnt++;
}
}
if(cnt==0)
{
sum += (double)len/s;
//printf("**%d %lf\n",len,s);
return;
}
for(int i=0;i<nn;i++)
{
int v=G[u][i];
if(!book[v])
{
book[v]=1;
dfs(v,len+1,s*(double)cnt);
}
}
return ;
}
int main()
{
while(~scanf("%d",&n))
{
int u,v;
for(int i = 1; i <= n; i++)G[i].clear();
for(int i = 1; i < n; i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
memset(book,0,sizeof(book));
book[1]=1;
sum=0;
dfs(1,0,1.0);
printf("%.15lf\n",sum);
}
return 0;
}