設:
我們分為兩個部分:兒子到父親與父親到兒子。
我們先設 \(f[i]\) 為 \(i\) 到 \(fa[i]\) 的期望移動步數。
顯然,分為兩種情況:
對於這種情況,只需要走一步即可到達父親節點,而這種概率為 \(\frac\) ,長度則為 \(1\) 。那麼貢獻期望長度為 \(\frac \)
對於這種情況,貢獻期望長度當然為:
(走到兒子的步數+兒子走到 \(i\) 的步數+ \(i\) 到父親的步數)/ \(d[i]\)
由於現在走到兒子已經是個欽定的事情,那麼步數為 \(1\) ,而兒子走到 \(i\) 的步數則必定為 \(f[son]\) ,\(i\) 到父親的步數則一定是 \(f[i]\) ,是不是看起來重複了 \(f[i]\) ,挺繞的 ?
那麼易得 \(f[i]=\frac\) ,即是將兩個情況的貢獻加在一起。由於 \(i\) 的兒子數肯定為 \(d[i]-1\) 我們考慮化簡這個式子,拆出 \(\sum\) 中的 \(1\) 與 \(f[i]\) :
\[ f[i]=\frac\\ f[i]=\frac\\ f[i]=\frac \]
接著我們將右邊的 \(f[i]\) 拆下來移項至左邊:
\[ f[i]=\frac+\frac\\ \frac=\frac \]
最後即可得到式子:
\[ f[i]=d[i]+\sum f[son] \]
我們設 \(g[i]\) 為 \(i\) 的父親移動到 \(i\) 的期望步數,並設 \(i\) 的父親為 \(x\) 。
那麼有三種情況:
這種情況下肯定為 \(\frac\) 的貢獻。
當然我們的長度肯定為:移動到 \(fa[x]\) 的步數+\(fa[x]\) 移動回 \(x\) 的步數+ \(x\) 移動到 \(i\) 的步數
\(=(1+g[x]+g[i])/d[x]\)
長度為:移動到兒子的步數+兒子移動回 \(x\) 的步數+\(x\) 移動到 \(i\) 的步數
\(=(1+f[son]+g[i])/d[x]\)
那麼貢獻之和為:
\[ g[i]=\frac(1+f[son]+g[i])} \]
由於 \(x\) 除 \(i\) 以外的兒子個數為 \(d[x]-2\) ,那麼可以如法炮製,像 \(f\) 陣列那樣化簡:
\[ g[i]=\fracf[son]} \]
消項移項可得:
\[ g[i]=g[x]+d[x]+\sum_f[son] \]
對於給定的 \(u->v\) 這樣一條樹上路徑,我們可以拆成兩條:
\(u->lca\) 與 \(lca->v\)
對於第一條路徑,肯定是全程向上的,對於第二條路徑,肯定是全程向下的。
那麼長度肯定為:
\[ \sum_ f[i] +\sum_g[i]-f[lca]-g[lca] \]
則我們可以使用樹上字首和記錄每個點到根節點的 \(f\) 與 \(g\) 之和,接下來就能夠利用字首和快速求出 \(\sum\) 的值了。
posted @
2019-01-29 08:21
洛水·錦依衛 閱讀(
...)
編輯收藏
Tree (樹上期望dp)
11.2 和 11.3 11.2 考慮1個隨機過程,第1次走到u號點的時間可以分成兩部分,第1部分是從1號點隨機遊走第1次走到u的父親p的時間,第2部分是從p開始走,第1次走到u的時間,由期望的線性性,第1次走到u的時間期望等於這兩部分期望的和。第1部分是乙個子問題,我們考慮怎麼解決第2部分,我們把...
樹上兩點期望距離
對於樹上的節點 i 設 d i 為 i 的度數,fa 為 i 的父親,sum limits j 為 i 的兒子。假設邊權均為 1 分別考慮兒子到父親 父親到兒子的期望。設 f i 表示兒子 i 到父親的期望距離。可以分為 2 種情況 直接到父親。概率為 dfrac 步數為 1 期望為 dfrac 先...
樹上兩點期望距離
求樹上兩點之間的期望距離。設d i 為i節點的度數。fa i 為i節點的父親。我們對於兩種不同的走法分別考慮。part1 兒子到父親 設此時期望步數為f i 顯然,只會有兩種情況 1.直接一步走到父親。2.先走到自己的兒子,再走回自己,再走到父親。對於情況1.概率為 frac 步數為1,期望為 fr...