P4284 [SHOI2014]概率充电器

链接:https://www.luogu.org/problemnew/show/P4284

题目描述

著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品—— 概率充电器:

“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决 定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看 吧!”

SHOI 概率充电器由n-1 条导线连通了n 个充电元件。进行充电时,每条导 线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率 决定。随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行 间接充电。

作为SHOI 公司的忠实客户,你无法抑制自己购买SHOI 产品的冲动。在排 了一个星期的长队之后终于入手了最新型号的SHOI 概率充电器。你迫不及待 地将SHOI 概率充电器插入电源——这时你突然想知道,进入充电状态的元件 个数的期望是多少呢?

输入输出格式

输入格式:

第一行一个整数:n。概率充电器的充电元件个数。充电元件由1-n 编号。

之后的n-1 行每行三个整数a, b, p,描述了一根导线连接了编号为a 和b 的 充电元件,通电概率为p%。

第n+2 行n 个整数:qi。表示i 号元件直接充电的概率为qi%。

输出格式:

输出一行一个实数,为能进入充电状态的元件个数的期望,四舍五入到小 数点后6 位小数。

输入输出样例

输入样例#1: 复制

3
1 2 50
1 3 50
50 0 0

输出样例#1: 复制

1.000000

输入样例#2: 复制

5
1 2 90
1 3 80
1 4 70
1 5 60
100 10 20 30 40

输出样例#2: 复制

4.300000

说明

对于30%的数据,n≤5000。

对于100%的数据,n≤500000,0≤p,qi≤100。

题解:概率dp,正难求反,求充不上的概率

#include<bits/stdc++.h>
using namespace std;
#define eps 1e-6
#define maxn 500005
double f[maxn],g[maxn],h[maxn];
int tot,head[maxn];
struct edge{
    int nxt,to;double w;
}G[maxn * 2 + 10];
void add(int u, int v, double w){
    G[++tot].to = v;
    G[tot].w = w;
    G[tot].nxt = head[u];
    head[u] = tot;
}
void dfs1(int u, int fa){//儿子的贡献

    for(int i = head[u]; i; i = G[i].nxt){
        int v = G[i].to;
        if(v == fa)continue;
        dfs1(v, u);
        h[v] = f[v] + (1 - f[v]) * (1 - G[i].w);//儿子充不上电的概率+儿子冲上电的概率*导线无电概率
        f[u] *= h[v];
    }
}
void dfs2(int u, int fa){    //父亲的贡献    

    for(int i = head[u]; i; i = G[i].nxt){
        int v = G[i].to;
        if(v == fa)continue;
        double t = (f[v] < eps) ? 0 : g[u] * f[u]/h[v];//父亲充不上电的概率,要出去他本身对父亲的贡献
        g[v] = (1 - t)*(1 - G[i].w) + t;
        dfs2(v, u);
    }
}
/*
    t =  g[fa] * f[fa] / f[u]
    g[u] = t + (1 - t)*(1 - w[fa][u])

*/
int main(){
    int n;
    double ans = 0;
    scanf("%d",&n);
    for(int i = 1; i < n; i++){
        int u, v, c;
        scanf("%d%d%d",&u,&v,&c);
        add(u, v, c/100.0);add(v, u, c/100.0);
    }
    for(int i = 1; i <= n; i++){
        int c;scanf("%d",&c);
        f[i] = 1 - c/100.0;
    }
    dfs1(1, 0);
    f[0] = 1; g[1] = 1;
    dfs2(1, 0);
    for(int i = 1; i <= n; i++)
        ans += (1 - f[i]*g[i]);//充上的概率=(1-父亲、儿子都让他充不上)
    printf("%.6lf\n",ans);
}

原文地址:https://www.cnblogs.com/EdSheeran/p/8992731.html

时间: 2024-10-20 01:08:57

P4284 [SHOI2014]概率充电器的相关文章

bzoj 3566: [SHOI2014]概率充电器 树形DP

首先普及一个概率公式 P(A+B)=P(A)+P(B)-P(AB) 题意:一些充电元件和导线构成一棵树,充电元件是否能充电有2种情况, 1.它自己有qi%的概率充电 2.与它相邻的元件通过导线给它充电(导线有p%的概率导通) 求最终充了电的元件的期望 题解:首先可以将元件能否充电分成3种情况考虑, 1.它自己给自己充好了电 2.它的儿子方向给它传送了电 3.它的父亲方向给它传送了电. 对于1,题目已经给出可以直接赋值, 对于2,可以通过一次树的深度遍历求得.pson[now]=pson[now]

[SHOI2014]概率充电器

[SHOI2014]概率充电器 题目 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定.随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电.作为 S

【BZOJ】3566: [SHOI2014]概率充电器

[算法]树型DP+期望DP [题意]一棵树上每个点均有直接充电概率qi%,每条边有导电概率pi%,问期望有多少结点处于充电状态? [题解]引用自:[BZOJ3566][SHOI2014]概率充电器 树形DP 概率DP by 空灰冰魂 最大的难点在于计算每个点充电期望时,两个节点各自的期望都会影响对方的期望. 所以考虑转化对象,改为求每个节点充不上电的期望,充不上电就不用考虑两者的相互影响. fi表示结点i由子结点和自身充不上电的概率 gi表示结点i由父结点充不上电的概率 第一次DFS: hi表示

Bzoj3566 [SHOI2014]概率充电器

Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 999  Solved: 428 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元

bzoj 3566: [SHOI2014]概率充电器

Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器:"采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!"SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定.随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电.作为 SHO

【bzoj3566】[SHOI2014]概率充电器 树形概率dp

题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件.进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定.随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电.作为 SHOI 公司的忠实客户,你无

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

https://www.luogu.com.cn/problem/P4284 比较套路的概率题? 由期望的线性性可以把每个点拆开来,然后答案就是每个点通电的概率之和. 通电的概率并不怎么好算,我们可以算点\(u\)不通电的概率\(f[u]\),然后答案就是 \[\sum\limits_{i=1}^n 1-f[i]\] 发现一个点要么被子树内的节点电到(这里的子树包括自己)要么由子树外的点发电. 先考虑子树内的好了. 显然\(f[u]\)为所有儿子\(v\)不会电到\(u\)的概率之积再乘上\(u

BZOJ 3566 SHOI2014 概率充电器 树形期望DP

题目大意:给定一棵树,每个点初始有一个概率为1,为1的节点会沿着边以边权上的概率向四周扩散,求最终期望有多少个点是1 OTZ 不想写题解了贴个代码吧= = 如果有不明白做法的直接问我就好了= = #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 500500 #define EPS 1e-7 using namespace std;

●BZOJ 3566 [SHOI2014]概率充电器

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t2×1+t3*1+...+tn×1 现在问题就是要去求每个点被通电的概率. 因为是一颗树,所以每个点是否通电只由三个因素决定: 自己给自己通电;儿子给自己通电;父亲给自己通电. 这里采取求反面的方法: 对于每个点u, 1.求出u所在的子树不能给u点通电的概率f[u]. 2.求出u的父亲不能给u点通电