題目鏈結
題目大意:
給你一棵樹,邊權都是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的可能已...