bzoj3036 綠豆蛙的歸宿

2021-07-11 22:52:15 字數 1383 閱讀 7998

time limit: 2 sec  

memory limit: 128 mb

submit: 319  

solved: 224 [

submit][

status][

discuss]

給出乙個有向無環的連通圖,起點為1終點為n,每條邊都有乙個長度。綠豆蛙從起點出發,走向終點。

到達每乙個頂點時,如果有k條離開該點的道路,綠豆蛙可以選擇任意一條道路離開該點,並且走向每條路的概率為 1/k 。

現在綠豆蛙想知道,從起點走到終點的所經過的路徑總長度期望是多少?

第一行: 兩個整數 n m,代表圖中有n個點、m條邊

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

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

4 41 2 1

1 3 2

2 3 3

3 4 4

7.00

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

poetize3

概率期望dp

f[i]表示從i到n的期望長度,則狀態轉移方程為:

f[i]=∑(f[e[i].to]+e[i].v)/outd[i]

其中outd[i]表示i點的出度,e[i].to是與i相連的點。

乙個小的總結:如果乙個點的每條出邊概率相同,則逆向dp更加容易求解

#include#include#include#include#include#include#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

#define ll long long

#define maxn 100005

using namespace std;

int n,m,cnt,head[maxn];

double f[maxn];

bool vst[maxn];

struct edge_typee[maxn*2];

inline int read()

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

return x*f;

}inline void add_edge(int x,int y,int v)

; head[x]=cnt;

}inline void dfs(int x)

if (!outd) return;

f[x]/=outd;

}int main()

dfs(1);

printf("%.2lf\n",f[1]);

return 0;

}

BZOJ3036 綠豆蛙的歸宿

感覺挺簡單的。就是乙個簡單的dag上的期望問題。暴力的話是把所有的路徑都算出來,長度加一起再除以總路徑數量。然後優化就是利用期望的線性性 可加性 我們把每條邊的期望算出來,然後再相加就可以了。顯然求期望 概率 邊長。我們可以考慮先把每個點經過的概率算出來,然後再往邊上轉移。因為是dag,所以我們直接...

BZOJ 3036 綠豆蛙的歸宿

題意 給定dag帶邊權連通圖,保證所有點都能到達終點n,每個點等概率沿邊走,求起點1到終點n的期望長度。n 10 5。演算法 期望dp 題解 f i 表示到終點n的期望長度。f n 0 f i f j e i w k i i j,k i 是i的出度。因為是點x等概率出發,所以一定要從x算,不能倒著來...

bzoj3036 綠豆蛙的歸宿

題目大意 給定 dag 帶邊權連通圖,保證所有點都能到達終點 n 每個點等概率沿邊走,求起點 1 到終點 n 的期望長度。題解 拓撲,然後倒著 dp 就可以了 卡點 無 c code include define maxn 100010 using namespace std int n,m,oud...