zoukankan      html  css  js  c++  java
  • 【bzoj3036】绿豆蛙的归宿 期望dp

    题目描述

    随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

    给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
    到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
    现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

    输入

    第一行: 两个整数 N M,代表图中有N个点、M条边
    第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边

    输出

    从起点到终点路径总长度的期望值,四舍五入保留两位小数。

    样例输入

    4 4
    1 2 1
    1 3 2
    2 3 3
    3 4 4

    样例输出

    7.00

    提示

    对于100%的数据  N<=100000,M<=2*N


    题解
    期望dp水题一道。
    f[i]表示从i到n的期望长度(有向无环连通图)。
    小心除零。
    #include <cstdio>
    #define N 100001
    int head[N] , to[N << 2] , val[N << 2] , next[N << 2] , cnt , out[N] , vis[N];
    double f[N];
    void add(int x , int y , int z)
    {
        to[++cnt] = y;
        val[cnt] = z;
        next[cnt] = head[x];
        head[x] = cnt;
    }
    void dfs(int x)
    {
        if(vis[x])
            return;
        vis[x] = 1;
        int i;
        for(i = head[x] ; i ; i = next[i])
        {
            dfs(to[i]);
            f[x] += f[to[i]] + val[i];
        }
        if(out[x])
            f[x] /= out[x];
    }
    int main()
    {
        int n , m , x , y , z;
        scanf("%d%d" , &n , &m);
        while(m -- )
        {
            scanf("%d%d%d" , &x , &y , &z);
            add(x , y , z);
            out[x] ++ ;
        }
        dfs(1);
        printf("%.2lf
    " , f[1]);
        return 0;
    }
  • 相关阅读:
    BZOJ2956: 模积和——整除分块
    BZOJ1257: [CQOI2007]余数之和——整除分块
    数位DP【模板】
    2019HDU多校第7场——构造
    AtCoder Grand Contest 032 B
    P3599 Koishi Loves Construction——构造题
    CF C. Vladik and fractions——构造题
    RMQ问题【模板】
    libevent多线程使用事项
    Linux查看进程运行的完整路径方法
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6204000.html
Copyright © 2011-2022 走看看