「ZJOI2015」地震后的幻想乡

想了半天,打开洛谷题解一看,最高票是_rqy的,一堆密密麻麻的积分差点把我吓跑。

据说有三种解法,然而我只学会了一种最辣鸡的凡人解法。


题意:给一个无向图\(G\),边权为\([0,1]\)间的实数,求这个图的最小生成树的最大边权期望。

提示:对于 \(n\) 个 \([0,1]\) 之间的随机变量 \(x_1,x_2,\dots,x_n\),第 \(k\) 小的那个的期望值是 \(\frac{k}{n+1}\)。


考虑使用这个提示来帮助解题。

首先有一个暴力做法,枚举边权的相对大小,然后做最小生成树,kruskal得到一棵树时拿提示算一下

这个想法启发我们钦定一个边集\(S\)作为前\(|S|\)小,如果这个边集加入第\(|S|\)小这条边时恰好使图联通,我们就可以算它的贡献是\(\frac{|S|}{m+1}\),如果我们还能算出它的方案并除上总方案,我们就可以得到它的概率,所以考虑去统计这个方案。

恰好联通这个条件并不好统计,我们转换一下,可以变成

恰好联通方案=加之前不连通方案-加之后不连通方案

然后比较自然的可以考虑压一个子集去做\(dp\)

令\(f_{S,i},g_{S,i}\)分别表示点集为\(S\),用了\(i\)条边,且点集联通/不连通的方案数,设\(d_S\)为点集\(s\)在图\(G\)中的边数

显然有

\[g_{S,i}+f_{S,i}=\binom{d_S}{i}
\]

考虑\(f\)的递推,我们枚举\(s\)的子集,并且钦定某个点\(k\)一定在子集里,有转移

\[f_{S,i}=\sum_{k\in T\subset S}\sum_{j=0}^{d_T}g_{T,j}\binom{d_{S-T}}{i-j}
\]

然后最后考虑如何统计答案,设\(U\)为全集,按照之前说的,答案为

\[\sum_{k=1}^{m+1}\frac{k}{m+1}\times \frac{f_{U,k-1}-f_{U,k}}{\binom{d_u}{k}}
\]

化简一下

\[\frac{1}{m+1}\sum_{k=1}^m\frac{f_{U,k}}{\binom{d_U}{k}}
\]


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::min;
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
double C[51][51],f[1<<10][51],g[1<<10][51];
int yuu[1<<10],dew[1<<10],n,m;
int main()
{
read(n),read(m);
for(int u,v,i=1;i<=m;i++)
{
read(u),read(v);
++dew[(1<<u-1)|(1<<v-1)];
}
for(int s=1;s<1<<n;s++)
for(int t=s;t;t=t-1&s)
yuu[s]+=dew[t];
C[0][0]=1;
for(int i=1;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 s=1;s<1<<n;s++)
{
for(int i=0;i<=yuu[s];i++)
{
for(int t=s-1&s;t;t=t-1&s)
if(t&(s&-s))
for(int j=0;j<=min(i,yuu[t]);j++)
f[s][i]+=g[t][j]*C[yuu[s^t]][i-j];
g[s][i]=C[yuu[s]][i]-f[s][i];
}
}
double ans=0;
for(int i=0;i<=m;i++) ans+=f[(1<<n)-1][i]/C[m][i];
ans/=m+1.0;
printf("%.6f\n",ans);
return 0;
}

2019.3.5

「ZJOI2015」地震后的幻想乡 解题报告的更多相关文章

  1. 「SHOI2016」黑暗前的幻想乡 解题报告

    「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...

  2. 「ZJOI2015」地震后的幻想乡

    /* 难度最低的解法 钦定一个边集S作为前S小如果这个边集假如第|S|小这条边时加入时S恰好联通, 那么我们就能够算出他的贡献了 恰好联通 = 加了这条边之前不连通方案数 - 加了这条边之后不连通方案 ...

  3. 【ZJOI2015】诸神眷顾的幻想乡 解题报告

    [ZJOI2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热 ...

  4. 「SCOI2014」方伯伯的玉米田 解题报告

    #2211. 「SCOI2014」方伯伯的玉米田 发现是取一个最长不下降子序列 我们一定可以把一个区间加的右端点放在取出的子序列的最右边,然后就可以dp了 \(dp_{i,j}\)代表前\(i\)个玉 ...

  5. 【LOJ】#2027. 「SHOI2016」黑暗前的幻想乡

    题解 我一开始写的最小表示法写的插头dp,愉快地TLE成60分 然后我觉得我就去看正解了! 发现是容斥 + 矩阵树定理 矩阵树定理对于有重边的图只要邻接矩阵的边数设置a[u][v]表示u,v之间有几条 ...

  6. 「SHOI2016」黑暗前的幻想乡

    题目链接 戳我 \(Describe\) \(n−1\)个公司,每个公司能修一些边,求每条边都让不同的公司来修的生成树的方案数 \(Solution\) 这道题很明显容斥.答案就是:所有都选的生成树个 ...

  7. loj2027 「SHOI2016」黑暗前的幻想乡

    矩阵树定理+模意义下整数高斯消元 #include <algorithm> #include <iostream> #include <cstring> #incl ...

  8. 「USACO11NOV」牛的障碍Cow Steeplechase 解题报告

    题面 横的,竖的线短段,求最多能取几条没有相交的线段? 思路 学过网络流的童鞋在哪里? 是时候重整网络流雄风了! 好吧,废话不多说 这是一道最小割的题目 怎么想呢? 要取最多,那反过来不就是不能取的要 ...

  9. LOJ2135 「ZJOI2015」幻想乡战略游戏

    题意 题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来,更别说和 ...

随机推荐

  1. MySQL中有关NULL的计算

    mysql> select NULL=NULL; #判断两个NULL是否相等,结果不是1也不是0 +-----------+ | NULL=NULL | +-----------+ | NULL ...

  2. openstack,docker,mesos,k8s关系

    openstack,docker,mesos,k8s什么关系? - 知乎https://www.zhihu.com/question/62985699 OpenStack + K8S 环境集成测试ht ...

  3. NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plus

    NGINX Docs | Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plushttps://docs. ...

  4. C\C++学习笔记 1

    C++记录1 C的头文件为math.h C++的为 cmath using编译指令 namespace 区分不同产品的函数.Mics::cout Linux::cout cout << 即 ...

  5. [转帖]50个必知的Linux命令技巧,你都掌握了吗?

    50个必知的Linux命令技巧,你都掌握了吗? https://blog.51cto.com/lizhenliang/2131141 https://blog.51cto.com/lizhenlian ...

  6. C# Note30: 软件加密机制以及如何防止反编译

    参考文章: C#软件license管理(简单软件注册机制) 软件加密技术和注册机制 .NET中的许可证机制--License 背景 .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间 ...

  7. python爬虫scrapy的LinkExtractor

    使用背景: 我们通常在爬去某个网站的时候都是爬去每个标签下的某些内容,往往一个网站的主页后面会包含很多物品或者信息的详细的内容,我们只提取某个大标签下的某些内容的话,会显的效率较低,大部分网站的都是按 ...

  8. VMware与CentOS的安装与Linux简单指令

    一 . VMware与CentOS系统安装 下载CentOS系统的ISO镜像 # 官方网站,国外网站,下载速度会很慢 www.centos.org # 由于国外的下载速度慢,我们可以使用国内的镜像源 ...

  9. linux不同终端的操作是如何在messages日志中区分的

    今天在定位一个问题时,查看message日志,需要知道message日志中的记录分别是哪个Xterm终端操作的.比较了半天才发现原来日志中可以通过pts来进行区分.如下所示: --12T15:::|n ...

  10. ExportHandler.ashx

    using KYZWeb.Common;using Liger.Data;//using Microsoft.Office.Interop.Excel;using System;using Syste ...