[解説] luogu_P4284_確率充電器(ツリールート変更DP

おそらく少しピックはそれから選ぶ、本当に素晴らしい書き込み、説明のshadowice1984を参照してください。

ここで私は、確率の問題について少しトリックが発生した事象の確率見つける方法で伝えたいP Pを、私たちは皆知っている実際には、いくつかの特別な近似アルゴリズムに加えて、我々はプログラムにおける確率法を計算する追加以外の何ものでもありません4つの操作のみ乗算、除算を保存し......と減算と除算は加算と乗算の逆です。

そして、ビューの確率ポイントには、あなたはすべての乗算の乗算と加算主義の原則は、孤立した事件を意味知っている必要がありますが、......さらには相互に排他的なイベントを意味し、式では非常に一般的な他の確率はすべてのイベントの確率であり、 1に等しいです

近似アルゴリズムを取り除くためにあれば確率的に、私たちは本当に唯一の3つの方程式は、(......ここでは条件付き確率を議論していない)を使用することができます

1.乗算原理

2.さらに原理

3. 1に等しいすべての確率

そのため、プロセス内の我々は、本質的に確率が一つのことをやっている求めている、このイベントは、独立したり、相互に排他的のいずれかであるイベントの数に分割され、中にいくつかの形質転換補完イベントを使用する必要があるかもしれません......

本当に今はまだ、この確率のためのオリジナルの期待から、非常に混乱している利益の一部をクリア

被験者の最初のポイントは自分の電気所定の充電状態であるか、導電性とそれに接続されていると、周辺エッジ点を、気づいたとの関係は、乗算の原理によって説明ので、変更後、我々は取るようにしなくてもよいの関係そうでない電源の確率を各ポイントを出て来てもらうよう、そして減らすには1を行きたいです

充電されない確率に換算すると、理由を知りませんでし話していました...

この問題は、サブツリーの外で使用されると、二つのサブ木はF、Gの配列は、木のDP一般的な手法なければなりません...ので、問題は少なくしなければなりませんでした

F、Gプロセスを求めて:

質問は今、私は充電時間の点vを与えることはできませんが、何でしょうか?、2例、1 V死点があり、2ポイントが電気V どちらの明らかに相互に排他的な、非導電側を、追加することが可能です

PIは、$ $ $設けI $は、エッジ確率ユニコムとしてその電荷は、$ val_ {I、J} $の確率であります

[V] +(1-F [V])*(1-val_ {I、V})F [I] =(1-PI)* \ prod_ {息子におけるV \} $ F:上記の文から$

 また$ FAによって$ G $の構成[i]は$サブツリー部分の外側と$ I $サブツリー$ FA以外位置[i]は$サブツリー

つまり、私は問題を解決するには、それを確認することです。$ $を除くすべてこのサブツリーの背後にあることから、$ [[i]はFA] $ gの前で言うことです...

その後、我々は、我々が知っている、実際には、新しい外部通信ブロックをv外部ユニコムブロックの父であるプラスサブツリーvの父は通信ブロックVサブツリー構成を掘る、Vのにルートを変更するプロセスで観察しました製品の転送の形で、従って直接に加えて、サブツリーの後に残っているDP値を掘る要求したいDP

この時点で、それぞれの確率は= $ Fを充電されていない点[I] *(G [FA [I] +(1-G [FA [I]])*(1-val_ {FA [i]は、I} ))$と$ F [i]に似て$

従って$グラム[I] = \ FRAC {ない充電中の各点の確率} {F [i]が+(1-F [I])*(1-val_ {FA [i]は、I})} $

 

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
const  int型 MAXN = 500009 ;
int型のn;
構造体ノード{
     int型 V、NXT。ダブルワット; 
} E [MAXN << 1 ]。
int型のヘッド[MAXN]、CNT;
ボイド追加(INT U、INT V、ダブルW){ 
    E [ ++ CNT] .V = V; E [CNT] .nxt =頭部[U];頭部[U] = CNT; E [CNT] .W = ワット; 
} 
二重Q [MAXN]。
ダブルF [MAXN]、G [MAXN]、[MAXN] ANS。
//ANS [I] = G [FA [i]は] +(1-G [FA [I]])*(1-VAL(FA [i]は、i))を
INT FA [MAXN]。
ボイド DFS1(int型のx、int型FF){ 
    FA [X] =のFF; [X] = F(1.0 - Q [X])。
    以下のためにint型 ; I I = I =ヘッド[X] {E [I] .nxt)
         INT Y = E [I] .V。
        もし(Y == FF)続けます
        DFS1(Y、X)。
        F [X] * = F [Y] +(1.0 -f [Y])*(1.0 - E [I] .W)。
    } 
} 
ボイド(DFS2 INT X){
     ためINTI =ヘッド[X]; I; I = E [I] .nxt){
         int型、Y = E [I] .V。もし(Y ==ファ[X])続けますダブル [X] /([Y] +(F F G =のANS [X] * 1.0 -f [Y])*(1.0 - [I] .W)E)。
//         のprintf( "%LFを\ n"、G)。
        ANS [Y] = G +(1.0 -g)*(1.0 - E [I] .W)。
        DFS2(Y)。
    } 
} 
int型のmain(){ 
    scanf関数(" %のD "、&N)
    int型 i = 1 ; iがN <I ++は、U、V、Wを{)
        のscanf("%D%D%D "、&​​U&V、&)W; 
        追加(U、V、W / 100.0); V、Uは、ワット/(追加100.0 ;)
    } 
    ためint型 I = 1 iは<; W = N; I ++)のscanf(" %dの"、&​​W)、Q [I] = W / 100.0 ; 
    ANS [ 1 ] = 1 ; 
    DFS1(11); DFS2(1 );
     二重和= 0 ;
     のためにint型 i = 1 ; iが<= N; iが++)合計+ = 1 -ans [I] * [I] F;
    printf(" %.6lfの\ nを" 、合計)。
//     (I = 1をint型、iが<= N; iが++)のためのprintf( "%3LF。"、ANS [I])。
}

 

おすすめ

転載: www.cnblogs.com/superminivan/p/11496972.html