Luogu P4316 綠豆蛙的歸宿

2022-02-23 13:08:39 字數 1237 閱讀 5016

「poetize3」

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

輸入格式:

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

輸出格式:

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

輸入樣例#1:

4 4 

1 2 1

1 3 2

2 3 3

3 4 4

輸出樣例#1:

7.00

對於20%的資料 n<=100

對於40%的資料 n<=1000

對於60%的資料 n<=10000

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

根據題意,總的期望路徑長度$=\sum$每條邊經過的概率*每條邊的權值

又因為是有向無環圖,所以每條邊經過的概率等於經過這條邊的終點的概率

這樣的話我們就可以在拓撲排序的過程中進行計算

**

#include #include #include #include #include const int maxn = 1e5+3;

using namespace std;

queuenode;

double f[maxn], ans, dis[maxn];

int n, m, indgr[maxn], cnt = 1, oudgr[maxn];

int first[maxn*2], next[maxn*2], u[maxn*2], v[maxn*2], w[maxn*2];

inline int read()

while (c <= '9' && c >= '0')

return x * f;

}int main()

for(int i=1; i<=n; i++)

if(!indgr[i])

while (cnt < n)

k = next[k];

} }printf("%.2lf", ans);

return 0;

}

Luogu P4316 綠豆蛙的歸宿 期望DP

題面 挺簡單的概率期望dp 設 f i 為 i 到 n 的期望路徑的長度 答案就是 f 1 f x dfrac f y dis d 是度數,y 是 x 的兒子,dis 就是距離 這個式子比較顯然 但是這個是從後往前推的 需要反著建圖然後再通過拓撲排序dp 如下 includeusing namesp...

洛谷 4316 綠豆蛙的歸宿

有向圖,等概率選擇路徑,問期望路徑長概率dp,f i 表示i節點的期望路徑長 因為dp無後效性,所以反向建圖,來一遍toposort就好了沒有反向建圖 include include define maxn 1000005 define double long double using namesp...

P4316 綠豆蛙的歸宿

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