【题解】SHOI2014概率充电器
首先发现答案就是每个节点有电的概率之和。有电的概率牵扯太广不好求,所以转化为求没有电的概率。这题最难的部分在于:一个节点如果有电,可以来自儿子,也可以来自父亲。我们考虑将这两个部分分离开来:建立状态 \(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概率充电器的更多相关文章
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- BZOJ3566: [SHOI2014]概率充电器 树形+概率dp
3566: [SHOI2014]概率充电器 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1888 Solved: 857[Submit][Stat ...
- 【BZOJ3566】[SHOI2014]概率充电器 期望+树形DP
[BZOJ3566][SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线 ...
- BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ 3566: [SHOI2014]概率充电器( 树形dp )
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- P4284 [SHOI2014]概率充电器
P4284 [SHOI2014]概率充电器 今天上课讲到的题orz,第一次做这种上下搞两次dp的题. g[i]表示i的子树(包括i)不给i充电的概率. f[i]表示i的父亲不给i充电的概率. g[]可 ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
- BZOJ3566 SHOI2014 概率充电器 【概率DP】
BZOJ3566 SHOI2014 概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能 ...
- BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP
BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技 ...
随机推荐
- 6 线程threading
1.第1种方式:threading模块 1)单线程执行 #-*- coding:utf-8 -*- import time def main(): print("我错了...") ...
- Dota2一直 正在登录服务器的解决办法
然后:1: c:\Windows\System32\drivers\etc\ 2:双击hosts文件,用记事本方式打开3:复制以下并粘贴至以记事本方式打开的hosts最后面111.221.33.253 ...
- linux-flock文件锁之实际运用
vi test.sh #! /bin/bash echo "Hello World" touch test.lock #随便命名 [root@localhost ~]# flock ...
- 『Python Kivy』API说明:kivy.app.App
App类是创建Kivy应用的基础.我们可以将其看成是Kivy运行循环当中的主入口.在绝大多数的例子中,你创建这个类的子类,然后构建你自己的应用.当你已经准备好开始应用的整个生命周期时,你可以实例化你定 ...
- Python 通过sgmllib模块解析HTML
""" 对html文本的解析方案-示例:在标签开始的时候检查标签中的attrs属性,解析出所有的参数的href属性值 依赖安装:pip install sgmllib3k ...
- 通过批处理命令for提取数据
前两天有这么个小需求: 在cmd中运行某测试工具后,会返回一个json结果,其中有一个参数的值每次都变且经常要用,正常情况复制粘贴就好了,但这个值非常长,配上cmd的标记+粘贴的行为,就很酸爽了.然后 ...
- JAVA基础学习之路(一)基本概念及运算符
JAVA基础概念: PATH: path属于操作系统的属性,是系统用来搜寻可执行文件的路径 CALSSPATH: java程序解释类文件时加载文件的路径 注释: 单行注释 // 多行注释 /*... ...
- JAVA基础:ArrayList和LinkedList区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...
- sparksql读写hbase
//写入hbase(hfile方式) org.apache.hadoop.hbase.client.Connection conn = null; try { SparkLog.debug(" ...
- 用 splice 函数分别实现 push、pop、shift、unshift 的方法
主要需要注意的是不同方法他们本身返回的值应该是什么,是数组当前的长度,还是取出的元素的值,再在splice函数里面进行相应的return就可以了.具体如下: 用 splice函数实现 push方法 f ...