BZOJ

洛谷

这里写的不错,虽然基本还是自己看转移...


每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\)。

把\(F_x\)分成:父节点通电给\(x\)带来的概率\(g_x\),和\(x\)及其子树通电给\(x\)带来的概率\(f_x\)。

对于两个独立的事件\(A,B\),由概率加法公式,\(P(A+B)=P(A)+P(B)-P(A)P(B)\),\(F_x=f_x+g_x-f_xg_x\)。

令\(p_x\)表示\(x\)本身通电的概率,\(p_{(x,v)}\)表示边\((x,v)\)通电的概率,那么\(f_x=p_x+\sum_{v\in son[x]}f_vp_{(x,v)}\)。注意这里的加法是概率的加法(相加再减去同时发生的概率)。

\(g_x\)的转移,就是\(F_{fa}\)减去\(x\)转移到\(fa\)的概率。因为\(P(A)=\frac{P(A+B)-P(B)}{1-P(B)}\),所以除去\(x\)的贡献外\(fa\)通电的概率\(q=\frac{F_{fa}-f_xp_{(fa,x)}}{1-f_xp_{(fa,x)}}\),所以\(g_x=q\times p_{(fa,x)}\)。

然后就做完啦。

ps:其实不是很懂第二次DFS,\(P(B)=1\)的时候(除\(0\))\(P(A)\)应该等于多少...

然而数据水?并不会出现\(P(B)=1\)的情况。

另一种DP方式:

还可以令\(F_x\)表示\(x\)不通电的概率,\(F_x=f_xg_x\)。那么只考虑子树的贡献,记\(h_v\)表示\(v\)给父节点贡献的概率,即\(h_v=f_v+(1-f_v)(1-p_{(x,v)})\),有\(f_x=(1-p_x)\prod h_v\)。

再考虑父节点的贡献\(g_x\),同样考虑直接减掉\(x\)对\(fa\)的贡献,即\(g_x=\frac{F_{fa}}{h_x}\)(注意特判\(h_x=0\)的情况)。

同样两次DP就OK啦。

调了半年原来是边权没开double...


代码写的第一种DP。

//38344kb	3684ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define eps 1e-10
//#define gc() getchar()
#define MAXIN 500000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=5e5+5; int Enum,H[N],nxt[N<<1],to[N<<1];
double f[N],F[N],pe[N<<1];
char IN[MAXIN],*SS=IN,*TT=IN; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void AE(int w,int v,int u)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, pe[Enum]=1.0*w/100;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, pe[Enum]=pe[Enum-1];
}
void DFS1(int x,int fa)
{
double b;
for(int i=H[x],v; i; i=nxt[i])
if((v=to[i])!=fa)
DFS1(v,x), b=f[v]*pe[i], f[x]=f[x]+b-f[x]*b;
}
void DFS2(int x,int fa)
{
for(int i=H[x],v; i; i=nxt[i])
if((v=to[i])!=fa)
{
double b=f[v]*pe[i];
if(fabs(1-b)<eps) F[v]=1;//=1怎么考虑的啊...网上都这么写的=-=
else
{
double q=(F[x]-b)/(1-b)*pe[i];
F[v]=f[v]+q-f[v]*q;
}
DFS2(v,x);
}
} int main()
{
const int n=read();
for(int i=1; i<n; ++i) AE(read(),read(),read());
for(int i=1; i<=n; ++i) f[i]=1.0*read()/100;
DFS1(1,1), F[1]=f[1], DFS2(1,1);
double ans=0;
for(int i=1; i<=n; ++i) ans+=F[i];
printf("%.6f\n",ans); return 0;
}

BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)的更多相关文章

  1. [BZOJ3566][SHOI2014]概率充电器 换根树形DP

    链接 题意:n个充电元件形成一棵树,每个点和每条边都有各自的充电概率,元件可以自身充电或者通过其他点和边间接充电,求充电状态元件的期望个数 题解 设1为根节点 设 \(f[x]\) 表示 \(x\) ...

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

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

  3. 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP

    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...

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

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

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

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

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

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

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

    题意:树上每个点有概率有电,每条边有概率导电,求每个点能被通到电的概率. 较为套路但不好想的概率DP. 树形DP肯定先只考虑子树,自然的想法是f[i]表示i在只考虑i子树时,能有电的概率,但发现无法转 ...

  8. [BZOJ 1907] 树的路径覆盖 【树形DP】

    题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...

  9. bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]

    4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...

  10. BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)

    BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...

随机推荐

  1. Kubernetes集群调度器原理剖析及思考

    简述 云环境或者计算仓库级别(将整个数据中心当做单个计算池)的集群管理系统通常会定义出工作负载的规范,并使用调度器将工作负载放置到集群恰当的位置.好的调度器可以让集群的工作处理更高效,同时提高资源利用 ...

  2. VMware 虚拟机运行卡慢的解决办法

    虚拟机的运行速度有一部分原因决定于你的物理机的配置,如果你的物理机配置不高,建议不要运行虚拟机,那样反而会更卡! 切记!!!在操作之前,先给虚拟机拍摄一个快照,然后所有操作都在虚拟机关机的情况下执行! ...

  3. Redis protocol (redis通信协议)

    以前只会用redis -cli客户端, 或者在java程序里使用jedis来作为介质与redis服务器通信.这两天正好在实习中接触了一点这方面的内容. 五一放假就稍微翻了翻redis相关资料. 本篇博 ...

  4. 页面加载过渡页 loading plugin css

    是前文 plugin 示例 loading 中需要用到的样式.现在样式扩充为 5类.loadtwo 使用到了bgimg /*loading animation loading one*/ /* loa ...

  5. [再寄小读者之数学篇](2014-06-22 求导数 [中国科学技术大学2014年高等数学B考研试题])

    设 $f(x)=x^2\ln(x+1)$, 求 $f^{(n)}(0)$. 解答: 利用 Leibniz 公式易知 $f'(0)=f''(0)=0$, $f^{(n)}(0)=(-1)^{n-3} n ...

  6. [物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射

    1. 偶极子: 相距为 $l$, 带电量分别为 $\pm q$ 的一对电荷组成的系统. 称 $$\bex {\bf m}=q{\bf l} \eex$$ 为电偶极矩, 其中 ${\bf l}$ 为 $ ...

  7. java中<T> T和T的区别

    如果希望 getMax 方法的返回值类型为 T,就要这样去定义getMax方法: public T getMax() 如果希望 getMax 方法返回值的类型由调用者决定,那么就这么去定义 getMa ...

  8. Codeforces Round #447 (Div. 2) B. Ralph And His Magic Field 数学

    题目链接 题意:给你三个数n,m,k;让你构造出一个nm的矩阵,矩阵元素只有两个值(1,-1),且满足每行每列的乘积为k,问你多少个矩阵. 解法:首先,如果n,m奇偶不同,且k=-1时,必然无解: 设 ...

  9. C# - LINQ 表达式树

    表达式树(Expression Tree) 表达式树是不可执行的代码,它只是用于表示一种树状的数据结构,树上的每一个节点都表示为某种表达式类型,大概有25种表达式类型,它们都派生自Expression ...

  10. springMVC源码笔记

    springMVC 设计总览 下图来源:https://www.cnblogs.com/fangjian0423/p/springMVC-directory-summary.html 下图来源:htt ...