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

2021-09-25 10:04:36 字數 1282 閱讀 4753

「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

如果這題不求期望的話就是個裸的dag上dp。但是本蒟蒻才初二。。什麼期望。。主要是今天集訓講這題了。

先構造圖,寫dfs轉移即可。

令dp[i]表示點i到終點的期望長度。

則:dp[i]=sum(dp[j]+weight[i][j])/k

其中weight為從i到j的邊權,k為點i的出度。

#include #include #include using namespace std;

double dp[100001];

int n,m,s,last[100001],out[100001],cnt;

bool vis[100001];

typedef struct

lxydl;

lxydl a[200001];

inline void add(int u,int v,int w)

void dfs(int i)

vis[i]=1;

register int j;

for(j=last[i];j;j=a[j].nxt)

if(out[i]) }

signed main()

dfs(1);

cout

}

洛谷P4316 綠豆蛙的歸宿 期望

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

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

時空限制 1000ms 128mb 題目描述 給出乙個有向無環圖,起點為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...