• 绿豆蛙的归宿


    题目链接

    题意:给一个有向无环图,起点是1,终点为n,选择每一条边的概率一样,求起点到终点的所经过的路径的期望长度。

    思路:设f[x]表示从节点x走到终点所经过的路径的期望长度,若从x出发有k条边,分别到达y1,y2...yk,边长为z1,z2...zk,

    所以根据数学期望的定义和性质,有:f[x]=1/k*∑(F[yi]+zi)

    显然f[N]=0,我们的目标是求f[1],所以我们从终点出发,在反向图拓扑排序,求f[x]。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<vector>
    #include<string>
    #include<set>
    #define ll long long
    using namespace std;
    const int N=200000+100;
    int ver[N],edge[N],nextt[N],head[N];
    int out[N],deg[N];
    int n,m,tot;
    double dis[N]; 
    queue<int> q;
    void add(int x,int y,int z)
    {
        ver[++tot]=y;
        edge[tot]=z;
        nextt[tot]=head[x];
        head[x]=tot;
     } 
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            add(y,x,z);
            deg[x]++;
            out[x]++; 
        }
        q.push(n);
        while(q.size())
        {
            int x=q.front();
            q.pop();
            for(int i=head[x];i;i=nextt[i])
            {
                int y=ver[i];
                dis[y]+=(dis[x]+edge[i])/deg[y];
                out[y]--;
                if(out[y]==0)
                q.push(y);
            }
        }
        printf("%.2lf
    ",dis[1]);
    }
  • 相关阅读:
    KMP算法
    找出第二大的数
    webpack 3 优化
    CocoaPods安装
    自适应水平垂直居中
    找出两个数组中都有,并且重复次数最多的元素
    swift 笔记
    Promise 用es5的基础实现
    $.ajax仿axios封装
    js基础拖拽效果
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/11332647.html
Copyright © 2020-2023  润新知