绿豆蛙的归宿

题目链接

题意:给一个有向无环图,起点是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]);
}
原文地址:https://www.cnblogs.com/2462478392Lee/p/11332647.html