zoukankan      html  css  js  c++  java
  • [题解] LuoguP4284 [SHOI2014]概率充电器

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

    比较套路的概率题?

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

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

    [sumlimits_{i=1}^n 1-f[i] ]

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

    先考虑子树内的好了。

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

    [f[u]=(1-p[u])prodlimits_{v in son(u)}(f[v]+(1-w(u,v)) imes (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
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    the address of vector
    C++ templete: "class" vs "typename" in a templateparameter
    [C++]Template Argument Deduction: automatic type conversation is not allowed
    C++0x learning: Sequencing rules of assignment.
    Good book for C++
    [C/C++]Switch比if else快.
    operator int*() vs int* operator ()()
    UML类图
    android中shape的使用(android:angle小解)
    Activity的Launch mode详解 singleTask正解
  • 原文地址:https://www.cnblogs.com/wxq1229/p/12541913.html
Copyright © 2011-2022 走看看