思路:
topsort+期望dp;
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 100005 int head[maxn],cnt,E[maxn<<],V[maxn<<],du[maxn];
int sta[maxn],top,n,m; double W[maxn<<],dp[maxn][],num[maxn]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} inline void edge_add(int u,int v,double w)
{
E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
} int main()
{
in(n),in(m);int u,v;double w;
for(;m--;)
{
in(u),in(v),du[v]++;
num[u]+=1.0;
scanf("%lf",&w);
edge_add(u,v,w);
}
dp[][]=,sta[++top]=;
while(top>)
{
int now=sta[top--];
for(int i=head[now];i;i=E[i])
{
dp[V[i]][]+=dp[now][]/num[now],du[V[i]]--;
dp[V[i]][]+=(dp[now][]*W[i]+dp[now][])/num[now];
if(!du[V[i]]) sta[++top]=V[i];
}
}
printf("%.2lf",dp[n][]);
return ;
}