Description

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

幻想乡一共有 \(n\) 个地方,那么最快的方法当然是修复 \(n-1\) 条道路将这 \(n\) 个地方都连接起来。 幻想乡这 \(n\) 个地方本来是连通的,一共有 \(m\) 条边。现在这 \(m\) 条边由于地震的关系,全部都毁坏掉了。每条边都有一个修复它需要花费的时间,第 \(i\) 条边所需要的时间为 \(ei\) 。地震发生以后,由于幽香是一位人生经验丰富,见得多了的长者,她根据以前的经验,知道每次地震以后,每个 \(ei\) 会是一个0到1之间均匀分布的随机实数。并且所有 \(ei\) 都是完全独立的。

现在幽香要出发去帮忙修复道路了,她可以使用一个神奇的大魔法,能够选择需要的那 \(n-1\) 条边,同时开始修复,那么修复完成的时间就是这 \(n-1\) 条边的 \(ei\) 的最大值。当然幽香会先使用一个更加神奇的大魔法来观察出每条边 \(ei\) 的值,然后再选择完成时间最小的方案。 幽香在走之前,她想知道修复完成的时间的期望是多少呢?

Input

第一行两个数 \(n\) ,\(m\),表示地方的数量和边的数量。其中点从1到 \(n\) 标号。 接下来 \(m\) 行,每行两个数 \(a\),\(b\),表示点 \(a\) 和点 \(b\) 之间原来有一条边。 这个图不会有重边和自环。

Output

一行输出答案,四舍五入保留6位小数。

Sample Input

5 4

1 2

1 5

4 3

5 3

Sample Output

0.800000

HINT

(以下内容与题意无关,对于解题也不是必要的。)

对于 \(n\) 个[0,1]之间的随机变量 \(x1,x2,...,xn\) ,第 \(k\) 小的那个的期望值是 \(k/(n+1)\) 。

样例解释:

对于第一个样例,由于只有4条边,幽香显然只能选择这4条,那么答案就是4条边的 \(ei\) 中最大的数的期望,由提示中的内容,可知答案为0.8。

数据范围:

对于所有数据:\(n\leq 10\), \(m\leq n(n-1)/2\),$ n,m\geq 1$。

对于15%的数据:\(n \leq 3\)。

另有15%的数据:\(n\leq10, m=n\)。

另有10%的数据:\(n\leq 10, m=n(n-1)/2\)。

另有20%的数据:\(n\leq5\)。

另有20%的数据:\(n \leq8\)。


想法

第一眼看题,呀呀呀条件这么少咋算期望啊!

第二眼看到了提示,\(emmm…\) (还是不会#捂脸#)

首先,如果我们知道 \(ei\) 的确切值,就可以把 \(ei\) 从小到大排序然后 \(kruskal\) ,恰构成最小生成树是加入的最后一条边边权即为答案。

这就得到一种暴力方法:枚举出所有边的相对大小,一次次跑 \(kruskal\) 后算平均。

接着考虑如何优化。

假设 \(kruskal\) 求最小生成树时加的最后一条边为第 \(i\) 小的,那么它对答案的贡献为 \(P(i) \times \frac{i}{m+1}\) ,\(P(i)\) 表示加上这个边后恰构成最小生成树的概率。

那么 \(ans=\sum\limits_{i=1}^{m} P(i) \times \frac{i}{m+1}=\frac{1}{m+1}\sum\limits_{i=1}^{m} P(i) \times i\)

而 \(P(i) \times i\) 可以理解为 \(P(i)\) 被加了 \(i\) 次

则 \(ans=\frac{1}{m+1}\sum\limits_{i=1}^{m} \sum\limits_{j=i}^{m} P(j)\)

我们再看后面这个东西 \(\sum\limits_{j=i}^{m} P(j)\) ,意义是用 \(i-1\) 条边无法形成生成树(即,无法使图联通)的概率,设其为 \(P'(i-1)\)。

显然,\(P'(i)=\frac{选i条边无法使图联通的方案数}{C_{m}^{i}}\)

于是,我们要求选 \(i\) 条边无法使原图联通的方案数

观察到 \(n\) 极小无比,我们考虑枚举子集的状压 \(dp\)

设 \(f[i][j][0/1]\) 表示在点集 \(i\) 中,选了 \(j\) 条边,该点集不连通/联通的方案数

求 \(f[i][j][0]\) 时用到一个小技巧:

将点集 \(i\) 分为互不联通的两个点集,令其中一个点集联通,另一个点集无所谓,保证这是一种符合要求的方案。

于是!!!找一个在点集 \(i\) 中的点 \(t\) , 枚举包含 \(t\) 的 \(i\) 的子集 \(k\) ,选若干条边使 \(k\) 联通,在点集 \(i-k\) 的生成子图中选剩下的边。

设 \(size[i]\) 表示 点集 \(i\) 的生成子图中的边数。

那么状态转移方程为:

\(f[i][j][0]=\sum\limits_{t\in k \subset i} \sum\limits_{s=0}^{max(size[k],j)} f[k][s][1] \times C_{size[i^k]}^{j-s}\)

由于我们知道 \(f[i][j][0]+f[i][j][1]=C_{size[i]}^{j}\),在我们求出 \(f[i][j][0]\) 后可求 \(f[i][j][1]=C_{size[i]}^{j}-f[i][j][0]\)

最后,\(ans=\frac{1}{m+1}\sum\limits_{i=1}^{m} \frac{f[全集][i-1][0]}{C_{m}^{i}}\)


代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; int read(){
int x=0;
char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
} const int N = 2048;
typedef long long ll; int n,m,w;
int size[N],u[100],v[100];
ll f[N][100][2],c[100][100]; int main()
{
n=read(); m=read();
for(int i=0;i<m;i++) u[i]=read(),v[i]=read(); w=(1<<n)-1;
for(int i=1;i<=w;i++)
for(int j=0;j<m;j++)
if((i&(1<<(u[j]-1))) && (i&(1<<(v[j]-1)))) size[i]++; 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 i=1;i<=w;i++){
int t=i&(-i); //注意!这里不要轻易给f[i][0][0]与f[i][0][1]赋初值!!!
for(int j=0;j<=size[i];j++){
for(int k=(i-1)&i;k;k=(k-1)&i){
if(!(k&t)) continue;
for(int l=0;l<=j && l<=size[k];l++)
f[i][j][0]+=f[k][l][1]*c[size[i^k]][j-l];
}
f[i][j][1]=c[size[i]][j]-f[i][j][0];
}
} double ans=0;
for(int i=0;i<m;i++) ans+=1.0*f[w][i][0]/(double)c[m][i];
printf("%.6lf\n",ans/(m+1.0)); return 0;
}

[bzoj3925] [洛谷P3343] [ZJOI2015] 地震后的幻想乡的更多相关文章

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

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

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

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

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

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

  4. P3343 [ZJOI2015]地震后的幻想乡

    传送门 给积分大佬跪了 再给状压大佬也跪了 //minamoto #include<bits/stdc++.h> #define rint register int #define ll ...

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

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

  6. 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)

    题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...

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

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

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

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

  9. BZOJ3925: [Zjoi2015]地震后的幻想乡【概率期望+状压DP】

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

随机推荐

  1. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  2. dotnet core 发布只带必要的依赖文件

    在使用 dotnet core 发布独立项目的时候,会带上大量依赖的库,但是通过微软提供的工具可以去掉一些在代码没有用到的库. 本文介绍的工具是 Microsoft.Packaging.Tools.T ...

  3. dubbo rest服务(消费者) java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine 错误问题

    1.版本 dubbo 2.7.3 2.描述 java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.Apac ...

  4. Mongdb的基本操作及java中用法

    Mongdb中所有数据以Bson(类似JSON)的格式存在,可以存储集合,map,二进制文件等多种数据类型. 数据库的常用操作 use [数据库名称];//有就选中,没有就添加并选中show dbs; ...

  5. 使用SonarQube+Eclipse来分析python代码

    背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...

  6. vue-awesome-swiper手动滑动后不再自动轮播的问题

    <swiper :options="swiperOption" ref="mySwiper" > <!--轮播图内容--> </s ...

  7. Appium环境搭建超详细教程

    前言: 本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现自由抓取App中想要的资源. 本系列以后会更的: Appium基本使用及控制真机及安卓模拟器 Mitmproxy抓包工 ...

  8. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告

    P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...

  9. ObjectArx 使用消息钩子实现鼠标滚轮旋转实体

    测试结果: 实现方法:主要是程序注册一个消息函数:func,拦截鼠标滚轮触发的消息,需要注意的是,以写的方式处理实体时需要锁定文档.注册func的主要方法是:BOOL acedRegisterFilt ...

  10. Redis-NoSQL入门和概述(一)

    NoSQL简史及定义 NoSQL 这个术语最早是在 1998 年被Carlo Strozzi命名在他的轻量的,开源的关系型数据库上的,但是该数据库没有提供标准的SQL接口:在2009 年再次被Eric ...