非常好也是比较难的题

首先,不难看出这是一道树形的概率dp

那么我们就要考虑转移

我们发现,一个点能充上电的概率是这个点本身通电的概率+这个点的子节点给他传过来电的概率+这个点的父节点给他传过来电的概率

但是这里的加法都是概率的加法,也就是说满足如下公式:

那么如果是三元事件,这个公式会更为复杂,所以这一点并不是特别容易计算

那么我们考虑正难则反:

一个点没有电的概率=父节点没传过来电的概率*子树内部没传过来电的概率(这里的子树内部包括子节点和这个节点本身)

所以我们用两个状态分别计算这两个概率:

设状态f[i]表示以i为根节点的子树中没有给i传过来电的概率,g[i]表示i的父节点没有给i传过来电的概率

那么显然,f[i]更容易转移,所以我们先转移f[i]

一个点的子树内部都没给他传过来电的概率,根据乘法原理,有:

解释:对于每个子节点,有两种可能向上继承:一是本身这个节点没有电,二是这个节点有电了但是连接这两点之间的边没有电

而且显然要求根节点本身不能有电,所以再乘一个根节点没有电的概率

这样第一个dfs就完成了

至于g[i]的转移,也是同理,首先,最大的根节点没有父节点,所以g[root]=1(这里root设为1)

然后从上向下更新,一个父节点不能更新子节点的情况是父节点没有通电或父节点通电了但中间的边没有通电,算一下这两部分的概率即可。

但是有个问题:我们知道,父节点没有通电的概率有一部分是由于子节点没有通电引起的,但是这里是用父节点更新子节点,这样会产生重复计算

所以我们在计算父节点没有通电的概率时要除掉子节点向父节点产生的贡献,这样才准确

所以表达式如下:

这就是第二个dfs

最后计算答案即可

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
struct Edge
{
int next;
int to;
double p;
}edge[1000005];
double ret[500005];
int head[500005];
double q[500005];
int cnt=1;
double f[500005];
double g[500005];
int n;
void init()
{
memset(head,-1,sizeof(head));
cnt=1;
}
void add(int l,int r,double pp)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
edge[cnt].p=pp;
head[l]=cnt++;
}
void dfs(int x,int fx)
{
f[x]=(1-q[x]);
for(int i=head[x];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==fx)
{
continue;
}
dfs(to,x);
f[x]*=f[to]+(1.0-f[to])*(1.0-edge[i].p);
}
}
void redfs(int x,int fx)
{
for(int i=head[x];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(to==fx)
{
continue;
}
double p0=f[x]*g[x]/(double)(f[to]+(1-f[to])*(1-edge[i].p));//父节点不通电的概率
g[to]=p0+(1-p0)*(1-edge[i].p);
redfs(to,x);
}
}
int main()
{
scanf("%d",&n);
init();
for(int i=1;i<n;i++)
{
int x,y;
double z;
scanf("%d%d%lf",&x,&y,&z);
z*=0.01;
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=n;i++)
{
scanf("%lf",&q[i]);
q[i]*=0.01;
}
dfs(1,1);
g[1]=1.0;
redfs(1,1);
double ans=0;
for(int i=1;i<=n;i++)
{
ans+=1.0-f[i]*g[i];
}
printf("%.6lf\n",ans);
return 0;
}

bzoj 3566的更多相关文章

  1. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...

  2. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  3. ●BZOJ 3566 [SHOI2014]概率充电器

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t ...

  4. BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)

    BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...

  5. 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)

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

  6. bzoj 3566 [SHOI2014]概率充电器——树型

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3566 一眼看上去高斯消元.n^3不行. 竟然直接去看了TJ.发现树型dp.一下想到了自己还没 ...

  7. bzoj 3566: [SHOI2014]概率充电器

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

  8. BZOJ 3566 [SHOI2014]概率充电器 ——期望DP

    期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...

  9. bzoj 3566: [SHOI2014]概率充电器【树形概率dp】

    设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...

随机推荐

  1. day 10 - 2 函数练习

    1.写函数 接收 n 个数字  求这些参数数字的和 def sum_func(*args): total = 0 for i in args: total += i return total prin ...

  2. timestamp的妙用

    代码 -- 卖家(登录后台使用, 卖家登录之后可能直接采用微信扫码登录,不使用账号密码) create table `seller_info` ( `id` varchar(32) not null, ...

  3. ionic3安装

    1.安装 1)安装nodejs: 官网下载安装 2)可选安装 cnpm:  //安装了cnpm后,以后用到npm安装的东西都可以把npm替换成cnpm npm install -g cnpm --re ...

  4. AngularJS--及其他js框架对比

    ----和 **类似?? Angular 2.谷歌的 React   Facebook的 Vue.js. Ember.js. https://github.com/angular/angular.js ...

  5. Polish Extraction Zone

    声明贴花组件 UPROPERTY(VisibleAnywhere, Category = "Components") UDecalComponent* DecalComp; 添加头 ...

  6. tomcat线程一直处于RUNNABLE,不接受请求

    最近项目中一个模块出现一个问题,本人做的比较浅显,所以很简单的问题一直搞了好几天,通过各种查资料.工具终于分析除了问题.问题如下: 现在对tomcat一个工程(会通过httpurlconnection ...

  7. Html input 常见问题

    1.input回车事件不执行导致页面刷新 场景:在文本框中输入关键字按回车,页面自动刷新了 <form name="keywordForm" method="pos ...

  8. Zookeeper-Watcher机制与异步调用原理

    转载于:http://shift-alt-ctrl.iteye.com/blog/1847320 Watcher机制:目的是为ZK客户端操作提供一种类似于异步获得数据的操作. 1)在创建Zookeep ...

  9. javacv:调取本地摄像头,抓取人脸,保存为图片

    MAVEN: <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platf ...

  10. 优秀员工的修炼——通往专家、管理之路

    (一)好员工的素质 好员工的类型有很多种,尝试着抽象出一个定义吧--好员工是那些主管分配其任务放心.同事喜欢与其共事.对自己工作负责.志在自我提升和价值实现的人.知识经济时代,好员工首先是做好自我管理 ...