地震后的幻想乡

题意:给定一张图,每条边的边权是一个 0~1 的随机实数,求最大边最小的生成树的期望权值。

n n n [ 0 , 1 ] [0,1] [0,1] 的随机变量,第 k k k 大的期望是 k / ( n + 1 ) k/(n+1) k/(n+1)

a n s × ( m + 1 ) = ∑ k P ( 加 入 k 条 边 后 图 恰 好 连 通 ) × k ans\times (m+1)=\sum_{k}P(加入 k 条边后图恰好连通)\times k ans×(m+1)=kP(k)×k

它等于 ∑ k = 1 m P ( 加 入 ≥ k 条 边 后 图 连 通 ) \sum_{k=1}^{m}P(加入 \geq k 条边后图连通) k=1mP(k),又等价于 ∑ k P ( 加 入 k − 1 条 边 后 图 不 连 通 ) \sum_kP(加入k-1 条边后图不连通) kP(k1)

于是现在我们要求选出 i 条边,不连通的概率 → \rightarrow 方案数(保证精度?)。

f[i][s][0/1] 表示在 s 集合里选了 i 条边,s 这个集合里的点 连通/不连通 的方案数。枚举子集转移。

#include
#define ll long long
#define pb push_back
#define ld long double
using namespace std;
struct edge {
	int u,v;
}e[1000];
ll f[50][1<<10],g[50][1<<10],C[120][120];
int sum[1<<10],num[1<<10];
int read()
{
	int x=0;char c=getchar(),flag='+';
	while(!isdigit(c)) flag=c,c=getchar();
	while(isdigit(c)) x=x*10+c-'0',c=getchar();
	return flag=='-'?-x:x;
}
int main()
{
	int n=read(),m=read();
	for(int i=1;i<=m;i++) e[i].u=read(),e[i].v=read();
	for(int i=1;i<(1<>1]+(i&1); 
	for(int i=0;i<(1<>u-1)&1)&&((i>>v-1)&1)) sum[i]++; 
		}
	}
	for(int i=1;i<(1<

你可能感兴趣的:(地震后的幻想乡)