題目傳送門
題目大意:給乙個dag,對於任意乙個點,它走每一條出邊的概率相同,問從起點走到終點的期望路程。
反著跑拓撲然後統計一下每個點到終點的期望路程就好了。
比如說現在拓撲到點 x
xx,設期望路程為 f[x
]f[x]
f[x]
,列舉出乙個點 y
yy 能到達 x
xx,那麼 y
yy 到終點的期望路程就要加上邊權+
f[x]
y的出度
\frac
y的出度邊權
+f[x
]。注意這題最好不要正著拓撲(即從起點開始拓撲),因為難以統計起點到每個點的期望路程,遞推時並不是直接讓 f[y
]f[y]
f[y]
加上 邊權+
f[x]
x的出度
\frac
x的出度邊權
+f[x
]這麼簡單,需要考慮的是 y
yy 的每條入邊被走的概率,而不是 x
xx 的出邊唄走的概率。(樣例就是個例子了)
而統計去終點的期望就不需要看入邊的概率,只需要考慮出邊的概率即可。
**如下:
#include
#define maxn 100010
int n,m;
struct edge
;edge e[maxn<<1]
;int first[maxn]
,len=0;
void
buildroad
(int x,
int y,
int z)
; first[x]
=len;
}int du[maxn]
,now[maxn]
,zhan[maxn]
,t=0
;double f[maxn]
;int
main()
}printf
("%.2lf"
,f[1])
;}
洛谷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...
洛谷 P4316綠豆蛙的歸宿
題目描述 記f i 表示經過i號點的概率。那麼點v從點u到達的概率 經過點u的概率 點u的出度。由於v可以由多個點走到,所以f v f u out u 計算f的過程可以在拓撲中完成,同時可以記錄走過這條邊的期望,相加就是答案。include include using namespace std c...
洛谷P4316 綠豆蛙的歸宿
題目描述 有一張 n n leq 10 5 個點的dag,圖上每一條邊都有乙個邊權 w 從1號點開始,一直走到 n 號點,沒到達乙個點,如果該節點有 k 條出邊,可以選擇任意一條邊離開該點,並且走向每條邊的概率為 frac 問到達 點 n 的期望路徑長度是多少?輸入樣例 4 4 1 2 1 1 3 ...