首先发现答案就是每个节点有电的概率之和。有电的概率牵扯太广不好求,所以转化为求没有电的概率。这题最难的部分在于:一个节点如果有电,可以来自儿子,也可以来自父亲。我们考虑将这两个部分分离开来:建立状态 \(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. EF Core ThenInclude 2.0自动完成提示有误,坑了一下

    只要代码正确,可以编译运行的... https://github.com/dotnet/roslyn/issues/8237

  2. Redis系列六 Redis事务

    Redis事务 1.介绍 在Redis事务中可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 2.事务的作用 一个队列中, ...

  3. 抽样分布(2) t分布

    定义 t分布 设X ~ N(0,1),Y ~ χ2(n),且X,Y相互独立,则称随机变量 服从自由度为n的t分布(学生氏分布) 记为 t~t(n),其概率密度为 由于tn(x)是偶函数,其图形关于y轴 ...

  4. pg mysql 比较

    PostgreSQL 与 MySQL比较: 一.pg优势: MySQL 不支持 OVER 子句, 而 Pg 支持 它可以存储 array 和 json, 可以在 array 和 json 上建索引, ...

  5. unity3d 计时功能舒爽解决方案

    上次也写了一篇计时功能的博客 今天这篇文章和上次的文章实现思路不一样,结果一样 上篇文章地址:http://www.cnblogs.com/shenggege/p/4251123.html 思路决定一 ...

  6. Linux命令应用大词典-第13章 用户和组群管理

    13.1 useradd:创建用户账户 13.2 adduser:创建用户账户 13.3 lnewusers:创建用户账户 13.4 usermod:修改用户账户 13.5 userdel:删除用户账 ...

  7. jQuery筛选器及对DOM修改(学习笔记)

    1.jQuery筛选器 注意:请先在管理Nuget程序包中查找jQuery包,并安装.也可以在jQuery官网下载. 实现: <!DOCTYPE html> <html xmlns= ...

  8. leetcode-回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶:你能否用 O(n) 时间复杂 ...

  9. 浪在ACM新春大作战

    题目链接: # Name 补题状态 A Memory and Crow 已补 B Memory and Trident 已补 C Memory and De-Evolution 已补 D Memory ...

  10. parity注记词和地址

    remix skilled curled cobweb tactics koala bartender precinct energize exes ridden cohesive 0x00EeC52 ...