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...