首先发现答案就是每个节点有电的概率之和。有电的概率牵扯太广不好求,所以转化为求没有电的概率。这题最难的部分在于:一个节点如果有电,可以来自儿子,也可以来自父亲。我们考虑将这两个部分分离开来:建立状态 \(g[i]\) 和 \(f[i]\) 分别表示一个节点只考虑子树节点没有电的概率以及不由父亲节点供电的概率。

\(g[u] = (1 - p[u])\prod (g[v] + (1 - g[v]) * (1 - w(u, v))])\)

其中\(v\) 为 \(u\) 的子节点,\(w(u, v)\) 为 \(u, v\) 边有电的概率

  利用这个递推式我们可以dfs一遍自下而上获取所有节点的 \(g[u]\);

  然后考虑如何求得 \(f[u]\)。要注意由于 \(f[u]\) 是 \(u\) 的父亲不供电给 \(u\) 的概率,所以在利用父亲的信息时应该要除去儿子的影响:

父亲 \(F\) 没有电的概率 \(P = f[F] * \frac{g[F]}{g[u] + (1 - g[u]) * (1 - w(F, u)))} \)

父亲不供电给儿子的概率为 :

\(f[u] = P + (1 - P) * (1 - w(F, u))\)

  这样就解决啦~(代码中的 \(f, g\) 与上述描述相反,早期代码请勿介意……)

#include <bits/stdc++.h>
using namespace std;
#define maxn 505000
#define db double
#define eps 0.0000001 int n, cnp = ;
int head[maxn];
db ans, p[maxn], f[maxn], g[maxn]; struct edge
{
int to, last; db co;
}E[maxn * ]; void add(int u, int v, db w)
{
E[cnp].to = v, E[cnp].co = w;
E[cnp].last = head[u], head[u] = cnp ++;
} bool check(db x) { return abs(x - 0.0) < eps; } void dfs(int u, int fa)
{
f[u] = 1.0;
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == fa) continue;
dfs(v, u);
f[u] *= f[v] + (1.0 - f[v]) * (1.0 - E[i].co);
}
f[u] *= (1.0 - p[u]);
} void dfs2(int u, int fa)
{
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == fa) continue;
db P = g[u] * f[u] / (f[v] + (1.0 - f[v]) * (1.0 - E[i].co));
g[v] = P + (1.0 - P) * (1.0 - E[i].co);
dfs2(v, u);
}
ans += 1.0 - (g[u] * f[u]);
} int main()
{
scanf("%d", &n);
for(int i = ; i < n; i ++)
{
int a, b, p;
scanf("%d%d%d", &a, &b, &p);
add(a, b, (db) p / 100.0);
add(b, a, (db) p / 100.0);
}
for(int i = ; i <= n; i ++) scanf("%lf", &p[i]), p[i] /= 100.0;
g[] = 1.0;
dfs(, ); dfs2(, );
printf("%.6lf\n", ans);
return ;
}

【题解】SHOI2014概率充电器的更多相关文章

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

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

  2. BZOJ3566: [SHOI2014]概率充电器 树形+概率dp

    3566: [SHOI2014]概率充电器 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1888  Solved: 857[Submit][Stat ...

  3. 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP

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

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

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

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

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

  6. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

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

  7. P4284 [SHOI2014]概率充电器

    P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...

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

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

  9. BZOJ3566 SHOI2014 概率充电器 【概率DP】

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

  10. BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP

    BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技 ...

随机推荐

  1. CF 570 D. Tree Requests

    D. Tree Requests http://codeforces.com/problemset/problem/570/D 题意: 一个以1为根的树,每个点上有一个字母(a-z),每次询问一个子树 ...

  2. FreeRTOS信号量的封装函数参数是二级指针

    1. 先看正确的封装方式,问题所在,为什么要用2级指针 void cissys_lockcreate(void** mutex) { //创建信号量,应该是互斥锁 *mutex = ((Semapho ...

  3. php webservice 可能存在的坑

    场景: 今天在生产机器上调用webservice失败 报 ...failed to load external entity... wget一下地址发现报500错误  把wsdl去掉再wget 发现就 ...

  4. 必读的 Android 文章

    必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...

  5. 低于0.01%的极致Crash率是怎么做到的?

    WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册). ...

  6. CentOS 7.2 安装zabbix 3.4

    一.zabbix版本选择及部署环境说明 1.zabbix版本选择 zabbix官网地址:www.zabbix.com zabbix每半年发布一个长期支持版,目前长期支持版有2.0.3.0等,所以选择z ...

  7. Oracle-数据库增删改查基本操作

    一.创建数据表 1).创建不存在的新表: create table tname(  Data_Name Date_Type [default][默认值]  );2).创建已存在表的副本 create ...

  8. org.apache.spark.sql.functions汇总

    测试数据: id,name,age,comment,date 1,lyy,28,"aaa bbb",20180102020325 scala> var data = spar ...

  9. 性能度量之Confusion Matrix

    例子:一个Binary Classifier 假设我们要预测图片中的数字是否为数字5.如下面代码. X_train为训练集,每一个instance为一张28*28像素的图片,共784个features ...

  10. POJ 1755 Triathlon(线性规划の半平面交)

    Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...