码迷,mamicode.com
首页 > 其他好文 > 详细

[题解] LuoguP4284 [SHOI2014]概率充电器

时间:2020-03-21 21:44:13      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:mit   www   答案   +=   int   bit   概率   tor   自己   

https://www.luogu.com.cn/problem/P4284

比较套路的概率题?

由期望的线性性可以把每个点拆开来,然后答案就是每个点通电的概率之和。

通电的概率并不怎么好算,我们可以算点\(u\)不通电的概率\(f[u]\),然后答案就是

\[\sum\limits_{i=1}^n 1-f[i]\]

发现一个点要么被子树内的节点电到(这里的子树包括自己)要么由子树外的点发电。

先考虑子树内的好了。

显然\(f[u]\)为所有儿子\(v\)不会电到\(u\)的概率之积再乘上\(u\)自己不发电的概率。所以有转移

\[f[u]=(1-p[u])\prod\limits_{v \in son(u)}(f[v]+(1-w(u,v))\times (1-f[v]))\]

\(p[u]\)表示\(u\)发电的概率,\(w(u,v)\)表示边\((u,v)\)通电的概率)

即对于\(v\)分两种情况

  • \(v\)没有被电,这时候不管怎样\(v\)都不会电到\(u\)
  • \(v\)被电了,这时候就要保证\((u,v)\)这条边不通电

发现这样只能算子树内的答案,乘法显然是可撤销的,于是换根DP就好了。

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;++i)
#define per(i,a,n) for (int i=n-1;i>=a;--i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
typedef double db;
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<int> VI;

const int N=5e5+10;
vector<pair<int,db>> e[N];
db prob[N];
int n;

db dp[N],f[N];

void dfs(int u,int ff) {
    dp[u]=1-prob[u];
    for (auto ei:e[u]) {
        int v=ei.fi; db w=ei.se;
        if (v==ff) continue;
        dfs(v,u);
        dp[u]*=dp[v]+(1-dp[v])*(1-w);
    }
}
void getans(int u,int ff) {
    for (auto ei:e[u]) {
        int v=ei.fi; db w=ei.se;
        if (v==ff) continue;
        db fu=f[u]/(dp[v]+(1-w)*(1-dp[v]));
        f[v]=dp[v]*(fu+(1-fu)*(1-w));
        getans(v,u);
    }
}

int main() {
    scanf("%d",&n);
    rep(i,0,n-1) {
        int u,v; db w;
        scanf("%d%d%lf",&u,&v,&w),w*=0.01;
        e[u].pb(mp(v,w));
        e[v].pb(mp(u,w));
    }
    rep(i,1,n+1) scanf("%lf",&prob[i]),prob[i]*=0.01;
    dfs(1,0);
    f[1]=dp[1];
    getans(1,0);
    db ans=0; rep(i,1,n+1) ans+=1-f[i];
    printf("%.6lf\n",ans);
    return 0;
}

[题解] LuoguP4284 [SHOI2014]概率充电器

标签:mit   www   答案   +=   int   bit   概率   tor   自己   

原文地址:https://www.cnblogs.com/wxq1229/p/12541913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!