洛谷P4316 綠豆蛙的歸宿 期望DP

2021-08-28 18:26:03 字數 1739 閱讀 5469

時空限制 1000ms / 128mb

題目描述

給出乙個有向無環圖,起點為1終點為n,每條邊都有乙個長度,並且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。 到達每乙個頂點時,如果有k條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,並且走向每條路的概率為 1/k 。 現在綠豆蛙想知道,從起點走到終點的所經過的路徑總長度期望是多少?

輸入格式:

第一行: 兩個整數 n m,代表圖中有n個點、m條邊 第二行到第 1+m 行: 每行3個整數 a b c,代表從a到b有一條長度為c的有向邊

輸出格式:

從起點到終點路徑總長度的期望值,四捨五入保留兩位小數。

說明

對於20%的資料 n<=100

對於40%的資料 n<=1000

對於60%的資料 n<=10000

對於100%的資料 n<=100000,m<=2*n

題目分析

d p[

u]

dp[u]

dp[u

]表示u

uun

nn的期望路徑長度

設u

uu出發能達到的點集為

\那麼d p[

u]=1

k∑(v

i+di

s(u,

vi))

dp[u]=\frac\sum (v_i+dis(u,v_i))

dp[u]=

k1​∑

(vi​

+dis

(u,v

i​))

k為u

uu的出度

由於是有向無環圖,所以直接在dag上記搜即可

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long lt;

typedef

double dd;

intread()

while

(ss>=

'0'&&ss<=

'9')

return f*x;

}const

int maxn=

100010

;int n,m;

struct nodee[maxn<<1]

;int head[maxn]

,tot;

int deg[maxn]

;dd dp[maxn]

;void

add(

int u,

int v,

int dis)

dd dp

(int u)

return dp[u]

=res;

}int

main()

dp(1)

;printf

("%.2lf"

,dp[1]

);return0;

}

洛谷P4316 綠豆蛙的歸宿 期望

poetize3 給出乙個有向無環圖,起點為1終點為n,每條邊都有乙個長度,並且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。到達每乙個頂點時,如果有k條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,並且走向每條路的概率為 1 k 現在綠豆蛙想知道,從起點走...

洛谷 P4316 綠豆蛙的歸宿 期望dp

poetize3 給出乙個有向無環圖,起點為1終點為n,每條邊都有乙個長度,並且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。到達每乙個頂點時,如果有k條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,並且走向每條路的概率為 1 k 現在綠豆蛙想知道,從起點走...

洛谷P4316 綠豆蛙的歸宿

思路 因為每條邊等概率,那麼就很輕鬆了,我們先跑個拓撲,確定拓撲序之後,從最後乙個點向前更新,初始是f n 0f n 0 f n 0 能到n的點會獲得 w i f n deg u frac deg u w i f n 的期望長度,因為u的度數是deg u deg u deg u 所以有1de g u...