zoukankan      html  css  js  c++  java
  • BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

     通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son))。然后再dfs一次考虑节点x子树以外对节点x的贡献, 通过x的father算一算就可以了.O(N)

    -----------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
     
    using namespace std;
     
    const double eps = 1e-8;
    const int maxn = 500009;
     
    int N;
    double dp[maxn], p[maxn];
     
    struct edge {
    int to;
    double w;
    edge* next;
    } E[maxn << 1], *pt = E, *head[maxn];
     
    void AddEdge(int u, int v, double w) {
    pt->to = v;
    pt->w = w;
    pt->next = head[u];
    head[u] = pt++;
    }
     
    void DFS(int x, int fa = -1) {
    dp[x] = 1 - p[x];
    for(edge* e = head[x]; e; e = e->next) if(e->to != fa) {
    DFS(e->to, x);
    dp[x] *= 1 - (1 - dp[e->to]) * e->w;
    }
    }
     
    void dfs(int x, int fa = -1) {
    for(edge* e = head[x]; e; e = e->next) if(e->to != fa) {
    if(e->w > eps && fabs((1 - dp[e->to]) * e->w - 1) > eps)
    dp[e->to] *= 1 - (1 - dp[x] / (1 - (1 - dp[e->to]) * e->w)) * e->w;
    dfs(e->to, x);
    }
    }
     
    void Init() {
    scanf("%d", &N);
    for(int i = 1; i < N; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    u--, v--;
    AddEdge(u, v, double(w) / 100);
    AddEdge(v, u, double(w) / 100);
    }
    for(int i = 0; i < N; i++)
    scanf("%lf", p + i), p[i] /= 100;
    }
     
    int main() {
    Init();
    DFS(0);
    dfs(0);
    double res = 0;
    for(int i = 0; i < N; i++)
    res += 1 - dp[i];
    printf("%.6lf ", res);
    return 0;
    }

    -----------------------------------------------------------------------------------

    3566: [SHOI2014]概率充电器

    Time Limit: 40 Sec  Memory Limit: 256 MB
    Submit: 358  Solved: 158
    [Submit][Status][Discuss]

    Description

    著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:
    “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!

    SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件。进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定。
    随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电。
    作为 SHOI 公司的忠实客户,你无法抑制自己购买 SHOI 产品的冲动。在排了一个星期的长队之后终于入手了最新型号的 SHOI 概率充电器。
    你迫不及待地将 SHOI 概率充电器插入电源——这时你突然想知道,进入充电状态的元件个数的期望是多少呢?

    Input

    第一行一个整数:n。概率充电器的充电元件个数。充电元件由 1-n 编号。
    之后的 n-1 行每行三个整数 a, b, p,描述了一根导线连接了编号为 a 和 b 的
    充电元件,通电概率为 p%。
    第 n+2 行 n 个整数:qi。表示 i 号元件直接充电的概率为 qi%。

    Output

    输出一行一个实数,为能够覆盖所有用户的最小椭圆的半短轴长,四舍五入到三位小数。

    Sample Input

    样例一:
    3
    1 2 50
    1 3 50
    50 0 0
    样例二:
    5
    1 2 90
    1 3 80
    1 4 70
    1 5 60
    100 10 20 30 40

    Sample Output

    样例一:
    1.000000
    样例二:
    4.300000

    HINT

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

    Source

  • 相关阅读:
    redis-cluster配置
    centeros7安装docker
    redis-sentinel主从复制高可用
    redis的主从同步
    redis安全(加入密码)
    redis的持久化相关操纵
    maria(mysql)的主从复制
    nginx+uwsgi+virtualenv+supervisor部署项目
    scrapy_redis之官网列子domz
    豆瓣模拟登录(双层html)
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5096200.html
Copyright © 2011-2022 走看看