BZOJ3036: 绿豆蛙的归宿

【传送门:BZOJ3036】


简要题意:

给出一个有向无环图,并且保证每条路径的起点为1,终点为n,且每条边都有权值

如果从一个点能到达k个点,那么它将会有1/k的概率走其中一个点

求出从起点到终点的期望


题解:

期望DP,DFS逆推


参考代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
double f[110000];
struct node
{
    int x,y,next;double d;
}a[210000];int len,last[110000];
void ins(int x,int y,double d)
{
    len++;
    a[len].x=x;a[len].y=y;a[len].d=d;
    a[len].next=last[x];last[x]=len;
}
int chu[210000];
bool v[110000];
int n;
void dfs(int x)
{
    if(x==n) return ;
    if(v[x]==false) v[x]=true;
    else return ;
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        dfs(y);
        f[x]+=f[y]+a[k].d;
    }
    f[x]/=chu[x];
}
int main()
{
    int m;
    scanf("%d%d",&n,&m);
    len=0;memset(last,0,sizeof(last));
    for(int i=1;i<=m;i++)
    {
        int x,y;double d;
        scanf("%d%d%lf",&x,&y,&d);
        ins(x,y,d);chu[x]++;
    }
    memset(v,false,sizeof(v));
    dfs(1);
    printf("%.2lf\n",f[1]);
    return 0;
}