傳送門
首先根據那啥啥期望的線性性,被充電原件的期望個數等於所有原件被充電的概率之和,於是我們考慮如何計算每乙個原件被充電的概率
首先自己被充電和被導電兩個概率是互相獨立的,計算還得容斥很麻煩,於是我們考慮轉為計算每個原件不會被導電的概率。乙個原件不導電就是自己沒電,別的節點也不會給它電。而別的節點的情況也分為兩類,一是自己就沒電,二是自己有電但邊不導電而這兩個事件是互相獨立的
我們先用樹形dp計算出乙個點不會被子樹內的點導電的概率是多少,設\(dp_i\)表示點\(i\)不導電的概率,\(p_i\)表示點\(i\)導電概率,\(val_i\)表示這條邊導電的概率,則\(dp_u=(1-p_u)\prod dp_v+(1-dp_v)(1-val_i)\)
然後考慮\(i\)不會被子樹外的點充上電的概率,設\(fa_i\)為點\(i\)不會被父親充電的概率,那麼點\(i\)不會被充電的概率就是\(fa_i*dp_i\),即父親和子樹都不會使它充上電。
然後考慮怎麼轉移,比方說\(u\)是\(v\)的父親,那麼\(v\)不會被\(u\)充電的情況就是\(u\)沒電或有電但邊不導電。如何計算不考慮\(v\)的子樹時\(u\)不導電的概率?因為轉移是通過乘法原理轉移的,所以只要把\(v\)對\(u\)的貢獻除去即可,也就是說只要用\(u\)不會被充電的總概率除以\(v\)不會使\(u\)充上電的概率即可
於是只要兩邊dfs,一遍求\(dp\),一遍求\(fa\)就可以了
如果有沒講清楚的地方可以看**,**應該還蠻好理解的
//minamoto
#includeusing namespace std;
typedef double db;
const int n=5e5+5;
int head[n],next[n<<1],ver[n<<1],tot;db edge[n<<1];
inline void add(int u,int v,db e)
db son[n],fa[n],st[n],res,p;int n;
void dfs1(int u,int fat)
}void dfs2(int u,int fat)
}int main()
BZOJ 3566 SHOI2014 概率充電器
題目 題意 給定樹形結構的n個元件,每個元件有一定概率自己充電,還有一定概率通過某條邊給其他元件充電,求充電的元件期望個數。n 500000 題解 樹形結構肯定能想到樹形dp,全樹對某點產生的貢獻一般可以通過一到兩遍樹形dp計算得出,本題所求期望等於每個元件被充電的概率之和。設f i 表示i被充電的...
bzoj3566 SHOI2014 概率充電器
n個充電器連成一棵樹。第i個充電器有p i 的概率直接充電。每條導線有一定機率可以導電。可以導電的導線形成的聯通塊中只要存在直接充電的結點整個聯通塊的充電器均進入充電狀態。問期望進入充電狀態的充電器個數 顯然可知我們只需要得到f i 表示i進入充電狀態的概率 那麼a ns f i 我們把無根樹變有根...
bzoj3566 SHOI2014 概率充電器
著名的電子產品品牌 shoi 剛剛發布了引領世界潮流的下一代電子產品 概率充電器 採用全新奈米級加工技術,實現元件與導線能否通電完全由真隨機數決定 shoi 概率充電器,您生活不可或缺的必需品 能充上電嗎?現在就試試看吧 shoi 概率充電器由 n 1 條導線連通了 n 個充電元件。進行充電時,每條...