您的位置:首页
BZOJ 3925 [Zjoi2015]地震后的幻想乡
2017-08-08 18:52
344 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?
id=3925
题意:给定一个n点m边的无向图,没有重边和自环。每条边的权值为[0,1]之间的随机变量,求最小生成树中最大边的期望权值。
n≤10,m≤n(n−1)2。
题解:依据期望的线性性,我们能够算出随机选前k小的那些边使图恰好连通的概率,则答案为概率之和除以(m+1),由于对于m个[0,1]之间的随机变量x1,x2,...,xm,第k小的那个的期望值是km+1。
此题略卡精度。所以我们能够考虑先算出可行方案数。再除以总方案数得到概率。
令cnt[i]表示点集i之间的无向边边数。f[i][j]表示点集为i,选用j条边使点集不连通的方案数,g[i][j]表示点集为i。选用j条边使点集连通的方案数,那么显然有f[i][j]+g[i][j]=(jcnt[i]),而计算f的方法。能够是通过枚举包括点集里某个定点的连通块大小来不重不漏的计数。
对于计算f[S]。考虑包括点集S中某个定点P的点集T,则T为S的真子集且T和S−T之间没有连边。就能够不重不漏地代表S不连通的全部情况。可是两个子点集的边数随意。仅仅用保证T是连通的,那么就有f[S][i+j]=∑T⊂Sg[T][i]∗(jcnt[S−T])
这个转移能够通过对子集的枚举做到O(3nm)。
令全集为all。于是答案为1m+1∑i=0mf[all][i](icnt[all])
这样做用
代码:
id=3925
题意:给定一个n点m边的无向图,没有重边和自环。每条边的权值为[0,1]之间的随机变量,求最小生成树中最大边的期望权值。
n≤10,m≤n(n−1)2。
题解:依据期望的线性性,我们能够算出随机选前k小的那些边使图恰好连通的概率,则答案为概率之和除以(m+1),由于对于m个[0,1]之间的随机变量x1,x2,...,xm,第k小的那个的期望值是km+1。
此题略卡精度。所以我们能够考虑先算出可行方案数。再除以总方案数得到概率。
令cnt[i]表示点集i之间的无向边边数。f[i][j]表示点集为i,选用j条边使点集不连通的方案数,g[i][j]表示点集为i。选用j条边使点集连通的方案数,那么显然有f[i][j]+g[i][j]=(jcnt[i]),而计算f的方法。能够是通过枚举包括点集里某个定点的连通块大小来不重不漏的计数。
对于计算f[S]。考虑包括点集S中某个定点P的点集T,则T为S的真子集且T和S−T之间没有连边。就能够不重不漏地代表S不连通的全部情况。可是两个子点集的边数随意。仅仅用保证T是连通的,那么就有f[S][i+j]=∑T⊂Sg[T][i]∗(jcnt[S−T])
这个转移能够通过对子集的枚举做到O(3nm)。
令全集为all。于是答案为1m+1∑i=0mf[all][i](icnt[all])
这样做用
double就能够保证精度了,无需
__float128。
代码:
#include <cstdio> const int maxn = 11, maxm = 46; int n, m, e[maxn], sz[1 << maxn], cnt[1 << maxn]; long long c[maxm][maxm], f[1 << maxn][maxm], g[1 << maxn][maxm]; double ans; int main() { scanf("%d%d", &n, &m); for(int i = 0; i < m; ++i) { int u, v; scanf("%d%d", &u, &v); --u; --v; e[u] |= 1 << v; e[v] |= 1 << u; } c[0][0] = 1; for(int i = 1; i <= m; ++i) { c[i][0] = c[i][i] = 1; for(int j = 1; j < i; ++j) c[i][j] = c[i - 1][j - 1] + c[i - 1][j]; } for(int s = 1; s < 1 << n; ++s) { sz[s] = sz[s >> 1] + (s & 1); if(sz[s] == 1) { g[s][0] = 1; continue; } for(int i = 0; i < n; ++i) if((s >> i) & 1) cnt[s] += sz[e[i] & s]; cnt[s] >>= 1; int lowbit = s & -s; for(int t = (s - 1) & s; t; t = (t - 1) & s) if(t & lowbit) for(int i = 0; i <= cnt[t]; ++i) for(int j = 0; j <= cnt[s ^ t]; ++j) f[s][i + j] += g[t][i] * c[cnt[s ^ t]][j]; for(int i = 0; i <= cnt[s]; ++i) g[s][i] = c[cnt[s]][i] - f[s][i]; } for(int i = 0; i <= m; ++i) ans += (double)f[(1 << n) - 1][i] / c[cnt[(1 << n) - 1]][i]; ans /= m + 1; printf("%.6f\n", ans); return 0; }
相关文章推荐
- BZOJ 3925 [Zjoi2015]地震后的幻想乡
- [BZOJ3925][ZJOI2015]地震后的幻想乡-概率与期望-动态规划
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- [期望 状压DP 子集DP 多项式] BZOJ 3925 [Zjoi2015]地震后的幻想乡
- BZOJ 3925 Zjoi2015 地震后的幻想乡 期望状压DP
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- bzoj3925 [Zjoi2015]地震后的幻想乡
- 【BZOJ 3925】【ZJOI 2015】[概率dp]地震后的幻想乡
- BZOJ 3925: [Zjoi2015]地震后的幻想乡
- [BZOJ3925][[Zjoi2015]地震后的幻想乡][期望+状压DP]
- BZOJ 3925 ZJOI2015 地震后的幻想乡
- bzoj 3925: [Zjoi2015]地震后的幻想乡
- BZOJ 3925: [Zjoi2015]地震后的幻想乡(概率)
- Bzoj3925--Zjoi2015地震后的幻想乡
- 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学
- BZOJ 3925 [Zjoi2015]地震后的幻想乡 ——期望DP
- 3925: [Zjoi2015]地震后的幻想乡
- BZOJ3295:[Zjoi2015]地震后的幻想乡(状压dp)
- 3925: [Zjoi2015]地震后的幻想乡
- BZOJ3925: [Zjoi2015]地震后的幻想乡