CF123E Maze(期望dp,樹形dp,式子)

2021-09-01 23:59:56 字數 1716 閱讀 7752

題目鏈結

題目大意:

給你一棵樹,邊權都是1,每乙個點有乙個是起點的概率和乙個是終點的概率,你將以起點為根,開始在樹上隨機dfs,每到乙個點,就會將他的所有兒子隨機打亂成序列,然後按照那個隨機順序走完,直到走到終點。求dfs從起點到終點的期望長度。

其實一開始看到這個題,還是有點懵逼的啊

根據期望的線性性,我們可以通過求所有相鄰點的期望,然後直接相加,得到ans

那我們可以這麼考慮,對於乙個點來說,假設我們要求的是從x

−>

yx->y

x−>y(y

yy是x

xx的兒子)的期望的話,如果走到乙個錯的兒子,那麼就需要2∗s

ize[

son]

2*size[son]

2∗size

[son

]步重新回來(相當於每條邊會走兩遍),而每個兒子在對應的y

yy之前的概率又都是1

2\frac

21​(所有排列中,要不是y在前,就是那乙個在前)

所以可以得知,每乙個點的貢獻 就是siz

e[x]

size[x]

size[x

] 那麼我們可以通過列舉終點,然後算其他子樹的siz

e[x]

size[x]

size[x

]以及概率和,求出來他們的貢獻

最後直接輸出ans就好

#include

#include

#include

#include

#include

#include

#include

#include

#define mk makr_pair

#define ll long long

using namespace std;

inline

intread()

while

(isdigit

(ch)

)return x*f;

}const

int maxn =

2e5+

1e2;

const

int maxm =

2*maxn;

int point[maxn]

,nxt[maxm]

,to[maxm]

;double val[maxn]

;int size[maxn]

;double st[maxn]

,ed[maxn]

;int n,m;

double sumst,sumed;

int cnt;

double ans;

void

addedge

(int x,

int y)

void

dfs(

int x,

int fa)

}int

main()

for(

int i=

1;i<=n;i++

)for

(int i=

1;i<=n;i++

)dfs(1

,0);

//cout(int x=

1;x<=n;x++)}

printf

("%.12lf"

,ans)

;return0;

}

CF123E Maze 期望 樹形dp

題目鏈結 題目鏈結是洛谷翻譯過的。題意 給你一棵樹,邊權都是1,每乙個點有乙個是起點的概率和乙個是終點的概率,你將以起點為根,開始在樹上隨機dfs,直到走到終點。求dfs從起點到終點的期望長度。n 10w 題解 我們考慮一條確定路徑從s到t的期望步數的計算方法。我們發現,這個答案根據期望的線性性,我...

CF678E(狀壓DP 期望)

4648.noip2016提高a組模擬7.17 錦標賽 problem n nn個人進行n 1 n 1n 1輪淘汰賽。已知i ii戰勝j jj勝率為ai,ja ai,j 求乙個排列使得1 11獲勝概率最大.n 18 n le 18 n 18 solution 首先考慮乙個暴力做法 如果已經知道了排列...

CF697D Puzzles 樹形dp 期望dp

給一棵樹,dfs時隨機等概率選擇走子樹,求期望時間戳。乙個非常簡單的樹形dp?期望dp。推導出來轉移式就非常簡單了。在經過分析以後,我們發現期望時間戳其實只需要考慮自己父親下來 步數加一 從兄弟回來兩種可能。設size i 為i節點子樹大小 包括自身 對於兄弟的情況,i節點的乙個兄弟有1 2的可能已...