正题

luogu 4284


题目大意

给你棵树,第i个点自己通电的概率是wiw_iwi​,第j条边连接的两个点之间通电的概率是pjp_jpj​,问你通电的点个数的期望值


题目大意

设fif_ifi​为第i个点通电的概率,那么:

fi=solvej∈link{i}(fi,fj∗pj)f_i=solve_{j\in link\{i\}}(f_i, f_j*p_j)fi​=solvej∈link{i}​(fi​,fj​∗pj​)

即从该点转一过来,fif_ifi​初值为wiw_iwi​,solve为合并两个概率

假设有x,y的概率由不同的两个方法通电,那么p=1-(1-x)(1-y)=x+y-xy,即是solve

可以先按上述方法向父亲转移,计算出子节点传递到x的贡献

.

然后可以再从根节点向下计算父亲向x的贡献,但是要减去该点传到父亲再传回去的概率,记不是由x传递过来,fa通电的概率为p,该点传到父亲的贡献为g,那么有:

p+g−pg=ffap+g-pg=f_{fa}p+g−pg=ffa​

p(1−g)=ffa−gp(1-g)=f_{fa}-gp(1−g)=ffa​−g

p=ffa−g1−gp=\frac{f_{fa}-g}{1-g}p=1−gffa​−g​

这样就可以得到其贡献了


代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 500050
using namespace std;
int n, x, y, tot, h[N], fa[N], deg[N];
double z, ans, g[N], f[N];
queue<int>d;
struct rec
{int to, next;double p;
}e[N<<1];
int read()
{char x=getchar();int ds=0,fs=1;while (x<'0'||x>'9') {if (x=='-') fs=-1;x=getchar();}while (x>='0'&&x<='9') ds=(ds<<3)+(ds<<1)+x-48,x=getchar();return ds*fs;
}
void add(int x, int y, double z)
{e[++tot].to = y;e[tot].p = z;e[tot].next = h[x];h[x] = tot;return;
}
double get(double x, double y)//计算
{return x + y - x * y;
}
void bfs()
{d.push(1);while(!d.empty()){int x = d.front();d.pop();for (int i = h[x]; i; i = e[i].next){int v = e[i].to;if (v != fa[x]){fa[v] = x;deg[v]--;d.push(v);}}}
}
void bfs1()
{for (int i = 1; i <= n; ++i)if (!deg[i])d.push(i);while(!d.empty()){int x = d.front();d.pop();if (!--deg[fa[x]]) d.push(fa[x]);for (int i = h[x]; i; i = e[i].next){int y = e[i].to;if (y != fa[x]){g[y] = f[y] * e[i].p;//从下向上传f[x] = get(f[x], g[y]);}}}return;
}
void bfs2()
{d.push(1);while(!d.empty()){int x = d.front();d.pop();for (int i = h[x]; i; i = e[i].next){int y = e[i].to;if (y != fa[x]){if (g[y] < 1.0) f[y] = get(f[y], ((f[x] - g[y]) / (1 - g[y])) * e[i].p);//从上到下传,保证分母不为0d.push(y);}}}
}
/*
void dfs1(int x, int fa)//dfs会暴栈
{f[x] = f[x] / 100.0;for (int i = h[x]; i; i = e[i].next){int y = e[i].to;if (y != fa){dfs1(y, x);g[y] = f[y] * e[i].p;f[x] = get(f[x], g[y]);}}return;
}
void dfs2(int x, int fa)
{for (int i = h[x]; i; i = e[i].next){int y = e[i].to;if (y != fa){if (g[y] < 1.0) f[y] = get(f[y], ((f[x] - g[y]) / (1 - g[y])) * e[i].p);dfs2(y, x);}}return;
}
*/
int main()
{n = read();for (int i = 1; i < n; ++i){x = read();y = read();z = read() / 100.0;add(x, y, z);add(y, x, z);deg[x]++;deg[y]++;}for (int i = 1; i <= n; ++i)f[i] = read() / 100.0;bfs();bfs1();bfs2();
//  dfs1(1, 0);
//  dfs2(1, 0);for (int i = 1; i <= n; ++i)ans = ans + f[i];printf("%.6lf", ans);return 0;
}

【期望DP】概率充电器(luogu 4284)相关推荐

  1. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  2. F - Sugoroku2 (期望dp)

    F - Sugoroku2 (期望dp) 概率和期望常用的算法是dp. 思路 本题是从后往前dp,设 d p [ i ] dp[i] dp[i]为从 i i i走到 n n n的期望,目标是 d p ...

  3. Luogu 4284 [SHOI2014]概率充电器

    BZOJ 3566 树形$dp$ + 概率期望. 每一个点的贡献都是$1$,在本题中期望就等于概率. 发现每一个点要通电会在下面三件事中至少发生一件: 1.它自己通电了. 2.它的父亲给它通电了. 3 ...

  4. BZOJ 3566: [SHOI2014]概率充电器 期望DP + 树形DP

    Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1276 Solved: 558 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世 ...

  5. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  6. 【概率与期望】【SHOI2014】概率充电器

    [描述] 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定! SHOI 概率充电器,您 ...

  7. BZOJ3566 [SHOI2014]概率充电器 (树形DP概率DP)

    3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: "采用全新纳米级加工技术,实现元件与 ...

  8. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  9. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

最新文章

  1. spring核心功能包中已经包含了cglib功能
  2. java发送小程序模板消息,记录_小程序发送模板消息
  3. 卡通角色表情驱动系列一
  4. 利用大数据构建智能交通
  5. jmeter导出测试报告
  6. ubuntu 12.04 lts搭建android 编译环境
  7. vbs比较两个数组里的数的大小_BAT 高频面试题:寻找两个有序数组的中位数
  8. 有Excel、Tableau、PowerBI都能做数据分析,为什么还要用Python
  9. Linux为硬盘重建MBR,linux重建mbr
  10. 微信小程序 指纹识别
  11. 初生牛犊不怕虎:年轻人的成长之路
  12. 读《七周七语言》,感悟其魂
  13. 数据结构和算法(Java),上
  14. Swiperjs插件轮播滑动卡顿优化
  15. 华为手机相片导入计算机,华为手机如何导出照片到电脑上 来学习吧
  16. 你不知道的十个 JS 小技巧
  17. 从计算机屏幕上抓取动态操作过程 也称为,计算机学业水平考试单项选择题综合训练一 答案复习过程...
  18. VScode运行js时,出现 'node' �����
  19. JS屏蔽浏览器F1到F12/屏蔽刷新F5
  20. php 过滤粘贴_粘贴过滤的数据时出现错误1004

热门文章

  1. php备份和恢复源码,PHP数据库备份还原类
  2. matlab基于ssd的角点匹配_基于关键点的目标检测
  3. gif android 点击 加载,android 加载显示gif图片的解决方案
  4. java先进先出 循环队列,JavaScript队列、优先队列与循环队列
  5. 修改手机屏幕刷新率_手机屏幕没有高刷新率算不上旗舰机?看看网友都是如何回答的...
  6. pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
  7. [Java基础]Stream流的常见中间操作方法
  8. [C++11]lambda表达式语法
  9. [蓝桥杯2016初赛]平方怪圈-数论,模拟
  10. git上托管的代码如何部署在阿里云上_居然仅用浏览器搞定Spring Boot应用的开发与部署...