Puzzles CodeForces 696B 樹形DP 期望計算
題目:https://cn.vjudge.net/problem/CodeForces-696B
題意:給出一棵n個點的有根樹,節點編號從1到n,編號為1的節點為樹根。
從1號節點開始dfs,從父節點訪問子節點時對子節點的選擇是隨機的,每訪問一個節點需要1秒的時間。問訪問到每個節點的時間期望是多少秒。
思路:從樹根向下遞推。
dp(i)表示節點的時間期望,dp(fa)表示父親節點的期望,dp(child)表示父節點對應的其中一個子節點的期望。
則dp(child)的計算可分為兩種
(1)如果從父節點直接訪問到子節點
dp1(child) = dp(fa) + 1
(2)若先訪問其他子節點,再訪問該子節點,那麼先訪問其他某個子節點的所需時間為訪問完這個節點和它的所有子孫所需的時間。由於任意一個節點先於該子節點訪問的概率都為0.5,是相等的,所以其他節點的訪問時間期望貢獻具有可加性,因此
dp2(child) = 0.5 * (child的兄弟節點數 + 所有兄弟節點對應所有子孫數)
綜上:dp(child) = dp(fa) + 1 + 0.5 * (child的兄弟節點數 + 所有兄弟節點對應所有子孫數)
實現上先遞迴處理出所有節點的子孫數,然後再dfs按上式遞推即可。
程式碼:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 100000 + 10;
int n;
int fa[maxn];
vector<int> child[maxn];
int childsize[maxn];
double ans[maxn];
int cntchild(int u)
{
if (child[u].empty())
{
return childsize[u] = 1;
}
childsize[u] = 1;
for (int i = 0; i < child[u].size(); i++)
{
childsize[u] += cntchild(child[u][i]);
}
return childsize[u];
}
void dfs(int u)
{
for (int i = 0; i < child[u].size(); i++)
{
int next = child[u][i];
ans[next] = ans[u] + 1 + 0.5 * (childsize[u] - 1 - childsize[next]);
dfs(next);
}
}
int main()
{
cin >> n;
fa[1] = 1;
for (int i = 2; i <= n; i++)
{
scanf("%d", &fa[i]);
child[fa[i]].push_back(i);
}
cntchild(1);
ans[1] = 1;
dfs(1);
for (int i = 1; i <= n; i++)
{
if (i != 1)
{
printf(" ");
}
printf("%.1f", ans[i]);
}
return 0;
}
相關文章
- ZROJ#398. 【18提高7】隨機遊走(期望dp 樹形dp)隨機
- 樹形DP!
- 樹形DP
- 樹上染色(樹形dp)
- [筆記]樹形dp筆記
- 樹形DP二三知識
- 樹上的等差數列 [樹形dp]
- [樹形dp][HAOI2015]樹上染色
- HDU 6035 Colorful Tree(樹形DP)
- 熟練剖分(tree) 樹形DP
- cf633F. The Chocolate Spree(樹形dp)
- BZOJ 4726 [POI2017]Sabota?:樹形dp
- CCF之網路延時(樹形dp)
- UVA 1220 Party at Hali-Bula (樹形DP)
- 費馬小定理-期望dp
- 【BZOJ3743】[Coci2015]Kamp 樹形DP
- SDOI2018 榮譽稱號(樹形dp)
- 【動態規劃】樹形DP完全詳解!動態規劃
- luogu P6835 概率DP 期望
- E73 樹形DP P3177 [HAOI2015] 樹上染色
- Luogu P3177 樹上染色 [ 藍 ] [ 樹形 dp ] [ 貢獻思維 ]
- HNOI2015亞瑟王(期望dp)
- HDU4652 Dice(期望dp推式子)
- cf1097D. Makoto and a Blackboard(期望dp)
- CF 1029E Tree with Small Distances 樹形DP or 貪心
- bzoj1060: [ZJOI2007]時態同步(樹形Dp)
- Luogu P11363 NOIP2024 樹的遍歷 題解 [ 紫 ] [ 樹形 dp ] [ 組合計數 ] [ adhoc ]
- P4564-[CTSC2018]假面【期望dp】
- CodeForces - 628D (數位dp)
- 牛客周賽 Round50 E-小紅的樹上移動 (期望dp+逆元)
- NOIP2024集訓Day23 DP常見模型4 - 樹形模型
- CF1039D You Are Given a Tree (樹形 dp + 貪心 + 根號分治)
- 【演算法學習筆記】概率與期望DP演算法筆記
- 樹:基本樹形
- bzoj2427: [HAOI2010]軟體安裝(強聯通+樹形Dp)
- E62 樹形DP P8677 [藍橋杯 2018 國 A] 採油
- 洛谷P4550 收集郵票 題解 期望DP
- 二叉搜尋樹 [四邊形不等式優化區間dp]優化
- 【JAVA】多邊形重心計算Java