題目看完以後就知道不會作。
而後題目的提示十分重要:對於 n 個 [0,1] 之間的隨機變量 x1,x2,...,xn,第k小的那個的指望值是 k/(n+1)。
假設咱們知道 \(m\) 條邊的權值,咱們作一遍克魯斯卡爾最小生成樹。答案就是最小生成樹中的邊權最大值。也就是加入後剛好使圖聯通的邊權。
根據題目的提示:本題的答案就是最小生成樹的最大邊權在 \(m\) 條邊中的指望排名\(/ (m+1)\)。
因此如今就是要求最小生成樹的最大邊權在 m 條邊中的指望排名。
而後由於指望的線性性,咱們能夠枚舉生成樹中最大邊在 \(m\) 條邊中的排名 \(i\) 再乘上最大邊在 \(m\) 條邊中的排名爲i的機率 \(P(i)\) 。也能夠說是加入第 \(i\) 條邊這個圖恰好聯通的機率。
就是:
\[ans=\frac{1}{m+1}\sum_{i=1}^{m}i*P(i)\]
這個式子和下面的式子等價。
\[ans=\frac{1}{m+1}\sum_{i=1}^{m}\sum_{j=i}^{m}P(j)\]
考慮\(\sum_{j=i}^{n}P(j)\)是什麼?其實就是加入 \(i-1\) 條邊圖不連通的機率。
因此問題轉化爲求加入 \(x\) 條邊圖不連通的機率。
而後這個機率顯然等於加入x條邊圖不連通的方案數\(/\)總方案數。
由於總方案數好求就是\(C_m^x\)
因此問題又轉化爲加入 \(x\) 條邊圖不連通的方案數。
考慮用狀壓DP解決。
\(dp[i][j][0/1]\) 分別表明選了在點集 \(i\) 的生成子圖中選了 \(j\) 條邊不連通\(/\)連通的方案數。
\(dp[i][j][0]\) 套路求法,設定一個關鍵點,枚舉關鍵點所在的連通子集 \(k\),和子集 \(k\) 的生成子圖中的邊數 \(s\),設 \(size[i]\)爲點集 \(i\) 中的邊的數量,轉移方程爲\(dp[i][j][0]=dp[k][s][1]*C_{size[i\ xor \ k]}^{j-s}\)。
利用\(dp[i][j][0]+dp[i][j][1]=C_{size[i]}^{j}\)就能夠求出 \(dp[i][j][1]\) 。
最後
\[ans=\frac{1}{m+1}\sum_{i=0}^{m}\frac{dp[(1<<n)-1][m][0]}{C_m^i}\]ios
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define int long long int dp[1111][111][2],n,m,u[111],v[111],C[111][111],size[1111]; double ans; int read(){ int sum=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();} return sum*f; } signed main(){ n=read();m=read(); for(int i=1;i<=m;i++)u[i]=read(),v[i]=read(); for(int i=0;i<(1<<n);i++) for(int j=1;j<=m;j++) if((i&(1<<(u[j]-1)))&&(i&(1<<(v[j]-1))))size[i]++; for(int i=0;i<=m;i++)C[i][0]=1; for(int i=1;i<=m;i++) for(int j=1;j<=m;j++) C[i][j]=C[i-1][j-1]+C[i-1][j]; for(int i=0;i<(1<<n);i++){ int p=i&(-i); for(int j=(i-1)&i;j;j=(j-1)&i){ if((j&p)==0)continue; for(int a=0;a<=size[j];a++) for(int b=0;b<=size[j^i];b++) dp[i][a+b][0]+=dp[j][a][1]*C[size[i^j]][b]; } for(int a=0;a<=size[i];a++)dp[i][a][1]=C[size[i]][a]-dp[i][a][0]; } for(int i=0;i<m;i++)ans+=1.0*dp[(1<<n)-1][i][0]/C[m][i]; printf("%.6lf",1.0*ans/(m+1.0)); return 0; }
```spa