CodeForces

来源:互联网 发布:linux jdk 降级 编辑:程序博客网 时间:2024/06/18 17:08

题目链接:http://codeforces.com/problemset/problem/839/C

题目大意:从根出发往下走,每到一个分叉有不同的选择,求最后走过的路径的期望

解题思路:Dfs时候记录下每个分叉口的概率,然后走到最后的时候乘上去

AC代码:

#include<cstdio>#include<cstring>#include<vector>#include<algorithm>using namespace std;const int MAXN = 100000 + 5;struct Edge {    int v, next;    Edge(int v=0,int next=0):v(v),next(next){}}edge[MAXN << 1];int tot = 0;double arr[MAXN];int edgenum = 0,head[MAXN];void toAdd(int u,int v){    edge[edgenum] = Edge(v, head[u]);    head[u] = edgenum++;}void Dfs(int u,int fa,int tier,double rate){    bool flag = 0;    int num = 0;    for (int i = head[u];i != -1;i = edge[i].next)    {        int v = edge[i].v;        if (v == fa) continue;        flag = 1;        num++;    }    if (!flag)    {        arr[tot++] = tier*rate;        return;    }    for (int i = head[u];i != -1;i = edge[i].next)    {        int v = edge[i].v;        if (v == fa) continue;        Dfs(v, u, tier + 1, rate / num);    }}int main(){    int n;    scanf("%d", &n);    memset(head, -1, sizeof(head));    for (int i = 1;i <= n - 1;++i)    {        int u, v;        scanf("%d%d", &u, &v);        toAdd(u, v);        toAdd(v, u);    }    Dfs(1, 1, 0, 1);    double sum = 0;    for (int i = 0;i < tot;++i)        sum += arr[i];    printf("%.9f\n", sum);    return 0;}