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

链接

题意:n个充电元件形成一棵树,每个点和每条边都有各自的充电概率,元件可以自身充电或者通过其他点和边间接充电,求充电状态元件的期望个数

题解

设1为根节点

\(f[x]\) 表示 \(x\) 不从以 \(x\) 为根的子树中充电的概率 ,前提自己不充电,再乘上儿子不充电或者边不充电的概率,因此有
\[ f[x]=(1-w[x])\prod(1-(1-f[y])\times w(x,y)) \]
这样进行第一次DP

再设 \(g[x]\) 表示 \(x\) 不充电的概率,他的前提是 \(f[x]\) 并且不从父亲上面充电。

如果从父亲上面充电,前提是父亲从父亲的父亲充电并且边也充电,用1减去这个概率就是不从父亲充电的概率
\[ g[y]=f[y]\times(1-w(x,y)\times(1-\frac{g[x]}{1-(1-f[y])\times w(x,y)})) \]
据说这东西叫换根DP,反正就是两遍DP就是了

#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
using namespace std;
typedef long long ll;
inline int read(){char c;int w;
    while(!isdigit(c=getchar()));w=c&15;
    while(isdigit(c=getchar()))w=w*10+(c&15);return w;
}
template<typename T,typename U>inline char smax(T&x,const U&y){return x<y?x=y,1:0;}
template<typename T,typename U>inline char smin(T&x,const U&y){return x>y?x=y,1:0;}
const int n=read(),N=5e5+5;
int head[N],tot;double w[N],f[N],g[N],ans;
struct node{int v,nxt;double w;}e[N<<1];
inline void add(int x,int y,double z){e[++tot].v=y,e[tot].w=z,e[tot].nxt=head[x];head[x]=tot;}
void go(int x,int fa){
    f[x]=1-w[x];
    for(int i=head[x];i;i=e[i].nxt){
        const int&y=e[i].v;
        if(y!=fa){
            go(y,x);
            f[x]*=1-(1-f[y])*e[i].w;
        }
    }
}
void dfs(int x,int fa){
    ans+=1-g[x];
    for(int i=head[x];i;i=e[i].nxt){
        const int&y=e[i].v;
        if(y!=fa){
            if((1-(1-f[y])*e[i].w)>1e-8)g[y]=f[y]*(1-(1-g[x]/(1-(1-f[y])*e[i].w))*e[i].w);
            else g[y]=f[y];
            dfs(y,x);
        }
    }
}
int main(){
    REP(i,2,n){
        int x=read(),y=read();double z=read()/100.;
        add(x,y,z),add(y,x,z);
    }
    REP(i,1,n)w[i]=read()/100.;ans=0;
    go(1,0);g[1]=f[1];dfs(1,0);printf("%f\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/HolyK/p/9885430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值