题目:

洛谷 3343

BZOJ 3925

分析:

谁给我说这是个期望概率神题的,明明没太大关系好吧

「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证。

首先,由于开始修路前 \(e_i\) 就已知了,所以显然是按照 \(e_i\) 从小到大的顺序修,直到连通。代价就是最后加入的边的权值。

这个提示非常地良心,同时结合期望的线性性可以发现答案就是对于所有的 \(k(0\leq k\leq m)\) ,任选 \(k\) 条边 恰好 连通 \(n\) 个点的概率乘上第 \(k\) 大的边权值的期望(即提示中的 \(\frac{k}{m+1}\) )。(注意,这里不需要考虑边的顺序。因为相当于每加入一条边都看一眼有没有连通,连通就退出,否则继续。所以当前是否退出只与之前选了哪些边有关,而与具体的顺序无关。)任意选 \(k\) 条边的方案数是 \(C_m^k\) ,恰好联通的概率就是恰好连通的方案数除以 \(C_m^k\) ,我们现在只需要求出恰好联通的方案数即可。于是现在变成了一个 在 CTS2019 中喜闻乐见的 计数题,和期望概率那一套已经没有任何关系了。

\(n\) 很小,考虑状压 DP 。设 \(f_{S,i}\) 表示选了 \(i\) 条边使 \(S\) 集合中的点 恰好 连通的方案数。这个「恰好」不好做, 正难则反 (这步真没想到),设 \(g_{S,i}\) 表示选了 \(i\) 条边还没有连通的方案数,则 \(f_{S,i}=g_{S,i-1}-g_{S,i}\) 。对于 \(g_{S,i}\) 的转移,为了不重不漏地计数,大力枚举某个 特定的点 所在连通块的大小(类似于 【洛谷4841】城市规划(多项式) 的思路),然后这个连通块之外的边可以随便选。即:

\[g_{S,i}=\sum_{T}\sum_{j=0}^i (C_{\mathrm{num}_T}^j-g_{T,j})\cdot C_{\mathrm{num}_{S-T}}^{i-j}
\]

其中 \((C_{\mathrm{num}_T}^j-g_{T,j})\) 就是在 \(T\) 中选 \(j\) 条边使其连通(不一定恰好)的方案数,\(T\) 是 \(S\) 的真子集且 \(\mathrm{lowbit}(T)=\mathrm{lowbit}(S)\) (把 \(S\) 中编号最小的点作为上述的「特定的点」),\(S-T\) 表示 \(T\) 相对于 \(S\) 的补集,\(\mathrm{num}_S\) 表示两端均在 \(S\) 中的边的数量。

暴力转移即可。时间复杂度 \(O(3^nm)\) 。

代码:

组合数最大 \(C_{45}^{22}\approx 4\times 10^{12}\) ,所以直接 long long 就可以存下。

小恐龙教的条件编译真好用

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std; namespace zyt
{
template<typename T>
inline bool read(T &x)
{
char c;
bool f = false;
x = 0;
do
c = getchar();
while (c != EOF && c != '-' && !isdigit(c));
if (c == EOF)
return false;
if (c == '-')
f = true, c = getchar();
do
x = x * 10 + c - '0', c = getchar();
while (isdigit(c));
if (f)
x = -x;
return true;
}
template<typename T>
inline void write(T x)
{
static char buf[20];
char *pos = buf;
if (x < 0)
putchar('-'), x = -x;
do
*pos++ = x % 10 + '0';
while (x /= 10);
while (pos > buf)
putchar(*--pos);
}
inline void write(const double &x, const int fixed = 9)
{
printf("%.*f", fixed, x);
}
typedef long long ll;
const int N = 10, M = N * N / 2, S = (1 << N);
ll g[S][M], C[M][M];
int num[S], n, m;
struct ed
{
int u, v;
}e[M];
inline bool check(const int a, const int p)
{
return a & (1 << p);
}
inline int lowbit(const int x)
{
return x & (-x);
}
int work()
{
read(n), read(m);
for (int i = 0; i < m; i++)
{
read(e[i].u), read(e[i].v);
--e[i].u, --e[i].v;
}
for (int i = 0; i <= m; i++)
{
C[i][0] = 1;
for (int j = 1; j <= i; j++)
C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
}
for (int i = 0; i < (1 << n); i++)
for (int j = 0; j < m; j++)
if (check(i, e[j].u) && check(i, e[j].v))
++num[i];
for (int i = 0; i < n; i++)
g[1 << i][0] = 0;
for (int S = 1; S < (1 << n); S++)
for (int T = (S - 1) & S; T; T = (T - 1) & S)
if (lowbit(T) == lowbit(S))
for (int i = 0; i <= m; i++)
for (int j = 0; j <= i; j++)
g[S][i] += (C[num[T]][j] - g[T][j]) * C[num[S ^ T]][i - j];
double ans = 0;
for (int i = 1; i <= m; i++)
ans += double(i) / (m + 1) *
(double(g[(1 << n) - 1][i - 1]) / C[m][i - 1] - double(g[(1 << n) - 1][i]) / C[m][i]);
write(ans, 6);
return 0;
}
}
int main()
{
#ifdef BlueSpirit
freopen("3343.in", "r", stdin);
#endif
return zyt::work();
}

【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)的更多相关文章

  1. 洛谷P3343 [ZJOI2015]地震后的幻想乡 [DP,概率期望]

    传送门 思路 题目给了一个提示:对于\(n\)个\([0,1]\)的随机变量,其中第\(k\)小的期望大小是\(\frac{k}{n+1}\). 这引导我们枚举边的相对大小的全排列,然后求最小生成树 ...

  2. BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3925 题意概述: 给出一张N点M边的最小生成树,其中每条边的长度为[0,1]的实数,求最小 ...

  3. [bzoj3925] [洛谷P3343] [ZJOI2015] 地震后的幻想乡

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

  4. 洛谷3343(ZJOI2015)地震后的幻想乡

    题目:https://www.luogu.org/problemnew/show/P3343 1.那个时间与边的大小排名有关,所以需要求一下最大边的期望排名就行. 2.期望排名是这样算的:(排名为1的 ...

  5. 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)

    题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...

  6. 【BZOJ3925】[ZJOI2015]地震后的幻想乡(动态规划)

    [BZOJ3925][ZJOI2015]地震后的幻想乡(动态规划) 题面 BZOJ 洛谷 题解 题目里面有一句提示:对于\(n\)个\([0,1]\)之间的随机变量\(x1,x2,...,xn\),第 ...

  7. ZJOI2015地震后的幻想乡

    题面链接 洛咕 sol %%%_rqy 本来想写正常的状压,看到这篇题解就入坑了... 直接搬题解吧,写的太好了不用解释. 慢慢搬,先咕着QAQ #include<cstdio> #inc ...

  8. 题解-ZJOI2015地震后的幻想乡

    Problem bzoj & 洛谷 题意简述:给定一个\(n\)(\(n\leq 10\))个点\(m\)条边的无向图,每条边的权值为一个\(0\)到\(1\)之间的连续随机变量,求图的最小生 ...

  9. BZOJ3925: [Zjoi2015]地震后的幻想乡

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

随机推荐

  1. tomcat配置访问项目时不需要加项目名称

    原文:http://blog.csdn.net/coolcoffee168/article/details/52582770 java web部署后,访问项目的时候,需要在地址中添加项目名称,那么如何 ...

  2. HOST绑定和VIP映射

    今天上线需要配置RAL,处理半天,发现是需要HOST和IP分开来配. 比如: curl -H "Host: ktvin.nuomi.com" "http://10.207 ...

  3. 猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:加入导航控制器 上一篇博 ...

  4. poj 1258 Agri-Net(Prim)(基础)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44487   Accepted: 18173 Descri ...

  5. 答读者问(6):有关IT培训和毕业之前的迷茫等问题

    近期在微博上与一些读者朋友们交流,发现大家对自己的未来都比較的关心.有些朋友认为在大学里面没有学到什么东西,问我要不要到一些IT培训机构去"速成".另一些朋友即将毕业,不知道自己走 ...

  6. Ubuntu16.04下安装Tensorflow GPU版本(图文详解)

    不多说,直接上干货! 推荐 全网最详细的基于Ubuntu14.04/16.04 + Anaconda2 / Anaconda3 + Python2.7/3.4/3.5/3.6安装Tensorflow详 ...

  7. gvoory脚本中关于HttpClient使用详解实例

    一.gvoory脚本中关于HttpClient使用详解实例 HttpClient:是一个接口 首先需要先创建一个DefaultHttpClient的实例 HttpClient httpClient=n ...

  8. Hadoop 解除 “Name node is in safe mode”

    运行Hadoop程序时,有时候会报以下错误:  org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. N ...

  9. C项目实践--图书管理系统(4)

    前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...

  10. p_CreateAuditEntry

    如果你能搜到我这篇博客,相信你导遇到的了和我一样在导入CRM组织时遇到了类似的错误.这个错误我查资料可以通过CRM升级来解决参考下面连接: https://support.microsoft.com/ ...