zoukankan      html  css  js  c++  java
  • Codeforces123E. Maze【树形dp】【概率dp】【证明题】

    LINK


    题目大意

    一棵树,上面的每个点都有一定概率成为起点和终点

    从起点出发,随机游走,并按照下列规则统计count:

    DFS(x)
        if x == exit vertex then
            finish search
        flag[x] <- TRUE
        random shuffle the vertices' order in V(x) // here all permutations have equal probability to be chosen
        for i <- 1 to length[V] do
            if flag[V[i]] = FALSE then
                count++;
                DFS(y);
        count++;
    

    求count的期望


    思路

    首先来证明一个东西:

    对于每个节点u,如果这个节点是终点,那么他的贡献是

    [sum_{(u,v)in E}siz_v*sump_v ]

    (sump_v)是子树内每个节点作为起始节点的概率和

    首先我们把一个以u为根子树拿出来,对于其中的每一个点v

    如果起始节点s在v的子树内,v一定会被经过1次,贡献(p_s)

    如果s不在v的子树内,v有(frac{1}{2})的概率会被经过,贡献(p_s*2*frac{1}{2}=p_s)

    不被经过的贡献是(0)

    然后来证为为什么有(frac{1}{2})的概率被经过

    从s开始进入每个子树,要么遍历完,要么停下来

    所以可以认为任何一个子树在停下来之前被访问的概率都是(frac{1}{2})

    然后这题做完了。。。泪奔ing


    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef double db;
    
    const int N = 1e5 + 10;
    
    int n, siz[N];
    vector<int> g[N]; 
    db p[N], q[N], sump = 0, sumq = 0, ans;
    
    void dfs(int u, int fa) {
      siz[u] = 1;
      for (auto v : g[u]) {
        if (v == fa) continue;
        dfs(v, u);
        siz[u] += siz[v];
        p[u] += p[v];
        ans += q[u] * siz[v] * p[v];
      }
      ans += q[u] * (n - siz[u]) * (sump - p[u]);
    }
    
    int main() {
      scanf("%d", &n);
      for (int i = 1; i < n; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        g[u].push_back(v);
        g[v].push_back(u); 
      }
      for (int i = 1; i <= n; i++) {
        scanf("%lf %lf", &p[i], &q[i]);
        sump += p[i], sumq += q[i];
      }
      dfs(1, 0);
      printf("%.15lf", ans / (sump * sumq));
      return 0;
    } 
    
  • 相关阅读:
    CentOS 6.4 x64 zabbix 2.2.2 编译安装
    Monitorix 监控 安装配置
    CentOS 6.4 x64 Percona-Server-5.6.15 源码安装
    CentOS 6.4 x64 安装 配置 Redmine 2.4.1
    ActiviMQ的基本使用
    Java内存 模型理解
    线程池的两种创建方式及区别
    线程创建的三种方式及区别
    Spring cloud 之Ribbon(二)负载均衡原理
    Spring cloud 之Ribbon(一)基本使用
  • 原文地址:https://www.cnblogs.com/dream-maker-yk/p/10206311.html
Copyright © 2011-2022 走看看