【bzoj3036】绿豆蛙的归宿

来源:互联网 发布:淘宝双11海报素材 编辑:程序博客网 时间:2024/06/10 09:46

Description

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

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

Input

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

Output

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

Sample Input

4 4

1 2 1

1 3 2

2 3 3

3 4 4

Sample Output

7.00
HINT

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

题解
f[i]表示i到终点期望走几步。
f[i]=sigma(f[j]+len)/du[i]

代码

#include<bits/stdc++.h>#define mod 1000003#define inf 10000000typedef long long ll;using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while (ch<'0'||ch>'9'){if (ch=='-')f=-1;ch=getchar();}    while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}double f[100005];int Next[200005],ret[200005],Head[100005],len[200005];int n,m,tot,du[100005];bool vis[100005];inline void ins(int u,int v,int l){    ret[++tot]=v;len[tot]=l;    Next[tot]=Head[u];Head[u]=tot;} void dfs(int u){    if (vis[u]) return;    vis[u]=1;    for (int i=Head[u];i;i=Next[i])    {        dfs(ret[i]);        f[u]+=f[ret[i]]+len[i];    }    if (du[u]) f[u]/=du[u];}int main(){    n=read();m=read();    for (int i=1;i<=m;i++)    {        int u=read(),v=read(),l=read();        ins(u,v,l);        du[u]++;    }    dfs(1);    printf("%.2lf",f[1]);    return 0;}
原创粉丝点击