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)
- Codeforces 235B Let's Play Osu! (概率dp求期望+公式變形)公式
- Codeforces 461B. Appleman and Tree[樹形DP 方案數]APP
- 樹形dp - Codeforces Round #322 (Div. 2) F Zublicanes and Mumocrates
- [筆記]樹形dp筆記
- 樹形DP二三知識
- 【Codeforces Round 362 (Div 2)D】【樹的遍歷 概率均分思想】Puzzles 兄弟節點的等概率遍歷下 樹的遍歷每點期望時間戳時間戳
- POJ 2486 Apple Tree(樹形dp)APP
- 費馬小定理-期望dp
- CCF之網路延時(樹形dp)
- POJ 3107 Godfather(樹形dp)Go
- HDU 5326 Work (基礎樹形dp)
- hdu 4123 樹形DP+RMQMQ
- POJ3107Godfather[樹形DP 樹的重心]Go
- 【動態規劃】樹形DP完全詳解!動態規劃
- 【樹形dp】poj 1947 Rebuilding RoadsRebuild
- SGU 495 Kids and Prizes:期望dp / 概率dp / 推公式公式
- hdu4313 貪心並查集 || 樹形dp並查集
- Codevs1378選課[樹形DP|兩種做法(多叉轉二叉|樹形DP+分組揹包)---(▼皿▼#)----^___^]dev
- HDU 3853 LOOPS:期望dp【網格型】OOP
- POJ 1947 Rebuilding Roads(基礎的樹形dp)Rebuild
- Luogu P3177 樹上染色 [ 藍 ] [ 樹形 dp ] [ 貢獻思維 ]
- 牛客周賽 Round50 E-小紅的樹上移動 (期望dp+逆元)
- 一個樹形聚集SQL問題(物料BOM消耗計算) ztSQL
- Codeforces 909C Python Indentation:樹狀陣列優化dpPython陣列優化
- codeforces 148 D 概率dp
- codeforces455A Boredom (裸DP)
- CF 1029E Tree with Small Distances 樹形DP or 貪心
- 【演算法學習筆記】概率與期望DP演算法筆記
- BZOJ1864[ZJOI2006]三色二叉樹[樹形DP]二叉樹
- E73 樹形DP P3177 [HAOI2015] 樹上染色
- URAL 1018 Binary Apple Tree(樹形dp入門題)APP
- CF1039D You Are Given a Tree (樹形 dp + 貪心 + 根號分治)
- Codeforces 372B Counting Rectangles is Fun:dp套dp
- CodeForces - 628D (數位dp)