SDOI 2014 重建 題解

2021-10-04 22:03:33 字數 1515 閱讀 1783

題目傳送門

題目大意:給出一張圖,**過後每條邊有乙個存在的概率,問**後圖變樹的概率。

又長見識了……還有個變元矩陣樹定理。

對於圖的一棵生成樹,它的出現概率為:存在的邊的 p[i

]p[i]

p[i]

之積乘不存在的邊的 (1−

p[i]

)(1-p[i])

(1−p[i

])之積。設圖為 g

gg,生成樹為 t

tt,那麼用柿子表示出來就是:∏e∈

tp[e

]×∏e

′∉t(

1−p[

e′])

\prod\limits_ p[e]\times \prod\limits_ (1-p[e'])

e∈t∏​p

[e]×

e′​

∈t∏​

(1−p

[e′]

),轉換一下得到 ∏e∈

tp[e

]1−p

[e]×

∏e′∈

g(1−

p[e′

])

\prod\limits_ \frac \times \prod\limits_ (1-p[e'])

e∈t∏​1

−p[e

]p[e

]​×e

′∈g∏

​(1−

p[e′

])。轉化後,一棵生成樹的出現概率就變成了樹中所有邊的 p[e

]1−p

[e

]\frac

1−p[e]

p[e]

​ 之積在乘上乙個定值 ∏e′

∈g(1

−p[e

′]

)\prod\limits_ (1-p[e'])

e′∈g∏​

(1−p

[e′]

) 了,然後所有生成樹出現概率總和就是答案。於是我們就可以將每條邊的邊權定為 p[e

]1−p

[e

]\frac

1−p[e]

p[e]

​,然後跑一次變元矩陣樹定理,最後乘上那個定值就是答案了。

**如下:

#include

#include

#include

using

namespace std;

#define maxn 60

#define eps 0.000001

int n;

double f[maxn]

[maxn]

,prod=

1.0;

double

det(

int l)

return re;

}int

main()

printf

("%.5lf"

,det

(n-1

)*prod)

;}

BZOJ3534 SDOI2014 重建 題解

t國有n個城市,用若干雙向道路連線。一對城市之間至多存在一條道路。在一次洪水之後,一些道路受損無法通行。雖然已經有人開始調查道路的損毀情況,但直到現在幾乎沒有訊息傳回。辛運的是,此前t國 調查過每條道路的強度,現在他們希望只利用這些資訊估計災情。具體地,給定每條道路在洪水後仍能通行的概率,請計算仍能...

SDOI2014 數表 解題報告

這題並沒有做出來。設f i d i d 考慮按f i 排序,則對於詢問 n m n m f i 會貢獻 nd d 1 d n id mid 這樣我們按照id考慮即可。但是我做的時候錯誤地把它化成了這樣 nd d 1 d ni d m i d 這樣就很難考慮出來該怎麼做了。include includ...

SDOI2014 向量集(凸包 線段樹)

題目鏈結 兩個操作 1.在序列s中加入乙個向量 2.求某個向量和s的區間 l,r l,r l,r 中向量的點積最大值。n m 105 n,m le 10 5 n,m 10 5考慮兩個向量 a1 b1 a2 b2 a 1,b 1 a 2,b 2 a1 b 1 a2 b2 詢問向量為 x,y x,y x...