BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3925
题意概述:
给出一张N点M边的最小生成树,其中每条边的长度为[0,1]的实数,求最小生成树中最大边的期望大小是多少。
N<=10,M<=N(N-1)/2.
由于本人实在太弱所以细节会描述的比较多。(精简版本见下方)
整理一下手里有的信息:
1.题目告诉我们N个大小在[0,1]的随机变量中第i大的期望大小为i/(N+1)。
2.由于两个[0,1]的随机变量大小相同的概率为0(小到为0),所以说只考虑每个随机变量大小不同的情况就可以了。
3.在所有边不同的条件下,在做最小生成树的时候第k条考察的边就是所有边中第k小的边(kruskal算法)。
所以如果知道图中最后一条加入最小生成树的边为所有边中第i大的概率p[i],那么答案就可以表示为:
ans=sum{ p[i] * i/(M+1) | 1<=i<=M }
根据信息3,可以发现p[i]实际上也就是第i条考察的边加入后恰好使得图连通的概率(注意i不是按照给出的边的顺序来考察的)。这又转化为了一个图的连通性问题,只要我们知道一个图中选择i条边使得图连通的概率xi,那么p[i]=xi-xi-1就是在第i条边加入之后图恰好连通的概率(因为i-1->i有两种可能,i-1就是连通的或者i-1是不连通的,所以是减法)。
好像某人说过“概率说到底还是一个组合计数问题”(离散概率),我们把这个概率xi用方案数来表示(注意到M<=45所以用C估计一下算出来的方案数的范围,并没有毛病)。设g(i)表示用i条边将图连通的方案数,则xi=g(i)/C(M,i)。(i条边使图连通的概率=i条边令图连通的方案数/选出i条边的方案数)
于是ans=sum{ (g(i)/C(M,i) - g(i-1)/C(M,i-1)) * i/(M+1) | 1<=i<=M }
接下来求出g问题就解决了。我们设g(s,i)表示用i条边将点集s中的点连通的方案数,那么f(s,i)表示用i条边不能将点集s中的点连通的方案数,有g(s,i)=C(cnt[s],i)-f(s,i),cnt[x]表示两端都在点集x中的边的条数。对于每个f(s,i)任意选择s中的一个点x,f(s,i)=sum{ g(ss,ii)*C(cnt[s-ss],i-ii) | ss为s的真子集且包含x,sz[ss]-1<=ii<=min(i,cnt[ss]),i-ii<=cnt[s-ss] },sz[s]表示集合s中点的数量。(方程的正确性:对于任意一种不连通的情况,一定存在至少两个连通分量,找到一个连通分量并枚举其所有连通的情况,用其方案数乘上对应情况下其他所有点可能的形态方案数累加到答案中)
于是再整理一下:ans=sum{ (g(2N-1,i)/C(M,i) - g(2N-1,i-1)/C(M,i-1)) * i/(M+1) | 1<=i<=M }
实际上到这里就完了但是敏锐的人发现方程中的g换成f之后好像可以化简?!由于原图是连通的所以当选用M条边的时候f(2N-1,M)=0,这样可以把展开后的式子的最后一项剩余的消掉,最后答案写为:ans=sum{ f(2N-1,i)/C(M,i) | 1<=i<M } / (M+1)
是不是很顺理成章?但是真的很抱歉自己想我真的。。。。。。ORZ
精简版本:
g(s,i)表示用i条边将点集s中的点连通的方案数,f(s,i)表示用i条边不能将点集s中的点连通的方案数,有g(s,i)=C(cnt[s],i)-f(s,i),cnt[x]表示两端都在点集x中的边的条数。
令x为s中任意一个点,f(s,i)=sum{ g(ss,ii)*C(cnt[s-ss],i-ii) | ss为s的真子集且包含x,sz[ss]-1<=ii<=min(i,cnt[ss]),i-ii<=cnt[s-ss] },sz[s]表示集合s中点的数量。
ans = sum{ (g(2N-1,i)/C(M,i) - g(2N-1,i-1)/C(M,i-1)) * i/(M+1) | 1<=i<=M } = sum{ f(2N-1,i)/C(M,i) | 1<=i<M } / (M+1)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int maxn=;
const int maxm=;
const int maxs=(<<)+;
typedef long long LL; int N,M;
int bin[maxn],cnt[maxs],sz[maxs];
LL f[maxs][maxm],g[maxs][maxm],C[maxm][maxm];
struct edge{ int u,v; }E[maxm]; void data_in()
{
scanf("%d%d",&N,&M);
int x,y;
for(int i=;i<=M;i++){
scanf("%d%d",&x,&y);
E[i]=(edge){x,y};
}
}
void dp()
{
for(int i=;i<=N+;i++) bin[i]=<<i-;
for(int i=;i<=M;i++){
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=C[i-][j]+C[i-][j-];
}
for(int s=;s<bin[N+];s++)
for(int i=;i<=M;i++)
if((bin[E[i].u]&s)&&(bin[E[i].v]&s)) cnt[s]++;
for(int s=;s<bin[N+];s++){
sz[s]=sz[s>>]+(s&);
for(int i=;i<=cnt[s];i++){
if(sz[s]==) g[s][i]=;
else{
int x;
for(x=;x<=N;x++) if(bin[x]&s) break;
for(int ss=(s-)&s;ss;ss=(ss-)&s) if(bin[x]&ss)
for(int ii=sz[ss]-;ii<=min(i,cnt[ss]);ii++)
if(i-ii<=cnt[s^ss])
f[s][i]+=g[ss][ii]*C[cnt[s^ss]][i-ii];
g[s][i]=C[cnt[s]][i]-f[s][i];
}
}
}
}
void work()
{
dp();
double ans=;
int all=bin[N+]-;
for(int i=;i<M;i++)
ans+=1.0*f[all][i]/C[cnt[all]][i];
printf("%.6f\n",ans/(M+));
}
int main()
{
data_in();
work();
return ;
}
BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望的更多相关文章
- BZOJ 3925 ZJOI2015 地震后的幻想乡
假设我们用了边权前i小的边使得图连通,那么对答案的贡献为i/m+1 又因为期望的线性性质,我们只需要求用了i条边就可以了 不妨设g(S)(i)表示用了i条边使得点集S连通的概率 设f(S)(i)表示用 ...
- BZOJ 3925: [Zjoi2015]地震后的幻想乡(概率)
CLJ就是喜欢出ctsc上讲的东西,看来还是得找时间把他的那几道题做下 首先记f(x)为答案>x的概率,那么把这个东西从0到1积分就是答案了 f(x)<=>边小于x不能使图联通的概率 ...
- BZOJ 3925 [Zjoi2015]地震后的幻想乡 ——期望DP
我们只需要考虑$\sum F(x)P(x)$的和, $F(x)$表示第x大边的期望,$P(x)$表示最大为x的概率. 经过一番化简得到$ans=\frac{\sum T(x-1)}{m+1}$ 所以就 ...
- BZOJ 3925: [Zjoi2015] 地震后的幻想乡(概率DP)
这里有一篇很好很强的博客%%% YouSiki大佬的博客 多理解一会就行了- 代码 #include <bits/stdc++.h> using namespace std; typede ...
- 【BZOJ3925】[ZJOI2015]地震后的幻想乡(动态规划)
[BZOJ3925][ZJOI2015]地震后的幻想乡(动态规划) 题面 BZOJ 洛谷 题解 题目里面有一句提示:对于\(n\)个\([0,1]\)之间的随机变量\(x1,x2,...,xn\),第 ...
- 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)
题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...
- [bzoj3925] [洛谷P3343] [ZJOI2015] 地震后的幻想乡
Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...
- [ZJOI2015]地震后的幻想乡(期望+dp)
题目描述 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任务是尽快让幻想 ...
- BZOJ3925: [Zjoi2015]地震后的幻想乡
Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...
随机推荐
- Java基础——线程复习总结
线程 T ...
- 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f5-zuul/ 本文出自方志朋的博客 在微服务架构中,需要几 ...
- Linux_vsftpd服务配置
首先安装Linux 企业版第一张光盘中的vsftpd-2.0.1-5.i386.rpm#rpm –ivh /media/cdrom/RedHat/RPMS/vsftpd-3.0.1-5.i386.rp ...
- 你不知道的javaScript笔记(7)
异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...
- SAP ABAP 日期,时间 相关函数
获的两个日期之间的分钟数 data min TYPE i. CALL FUNCTION 'DELTA_TIME_DAY_HOUR' EXPORTING T1 = ' T2 = ' D1 = ' D2 ...
- Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver (mybatis逆向工程)
springboot整合mybatis时出现的问题 解决方法:在pom.xml中plugin中加入单独依赖Mysql驱动包,问题便可解决 <plugin> <groupId>o ...
- p标签内不能含有块元素。
原来一直听网上这样说.自己并没有实际遇到过.上例子. <!DOCTYPE html> <html> <head> <meta charset="ut ...
- Java源码解析——集合框架(五)——HashMap源码分析
HashMap源码分析 HashMap的底层实现是面试中问到最多的,其原理也更加复杂,涉及的知识也越多,在项目中的使用也最多.因此清晰分析出其底层源码对于深刻理解其实现有重要的意义,jdk1.8之后其 ...
- 基于pyecharts的IT各行业薪资展示
我们的项目是一个信息采集系统,采集的是51job招聘网站,我爬取了Python,Java,C++,PHP还有北京各地区的职位数量,以及经验要求,和学历要求等等. 网页头; <!DOCTYPE h ...
- JVM内存管理机制和垃圾回收机制
JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...