「ZJOI2015」地震后的幻想乡

传送门

Description

题目的理解方式:

给定\(n\)个点,和\(m\)条边,每条边的期望完成时间都是一个\([0,1]\)内的随机数

求使得所有点都联通的期望时间

\(n \leq 10\)

Solution

首先,对于\(n\)个\([0,1]\)之间的随机变量\(x_1,x_2,x_3,...,x_n\),第\(k\)小的那个数的期望值是\(\frac{k}{n+1}\)

所以,此题等价于是生成树的\(n-1\)条边中最后一个出现的边的期望排名

假设这个排名为\(i\)的概率是\(P(i)\)

那么:
\[
ans=\frac{1}{m+1}\sum_{i=1}^{m}iP(i)
\]
我们再设\(p(i)\)表示最后一个出现的边排名\(\geq i\)的概率

原式转化为:
\[
\sum_{i=1}^{m}iP(i)=\sum_{i=1}^{m}p(i)
\]
然而事实上\(p(i)\)可以表示为加入\(i-1\)条边后原图不连通的概率

设原图为\(<V,E>\),\(V\)为点集,\(E\)为边集
\[
p(i+1)=\frac{f_{i,V}}{C(m,i)}
\]
对于上面的式子,\(f_{i,S}\)表示从\(S\)的生成子图中选出\(i\)条边,不能够使得点集联通的方案数

再设\(g_{i,S}\)表示从\(S\)的生成子图中选出\(i\)条边,够使得点集联通的方案数

对于集合\(S\)的生成子图\(<S,E_S>\)
\[
f_{i,S}+g_{i,S}=C(|E_S|,i)
\]
考虑转移,可以枚举当前集合中的一个点\(x\)所在的联通块以及这个联通块的边数
\[
f_{i,S}=\sum_{S' \subset S,x\in S'}\sum_{j=0}^{|E_{S'}|}g_{j,S'}C(|E_{S-S'}|,i-j)
\]
怎么求出边集的大小呢?

首先求出每个点与某个集合的连边数量\(Num_{i,S}\)

对于一个集合\(S\),\(|E_S|=|E_{S-x}|+Num_{x,S-x},x\in S\)

然后,就没有然后啦

组合数怎么算?目测会很大,用\(double\)存吧,写递推版

因为有枚举子集,所以复杂度是\(能过O(3^nm^2)=O(能过)\)

Code?

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
#define reg register
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
int N,M;
bool mp[10][10];
int Num[10][1<<10],id[1<<10],E[1<<10];
double f[50][1<<11],g[50][1<<10];
double C[50][50],ans;
double c(int x,int y){if(x<y)return 0.;return C[x][y];}
int main()
{
    N=read(),M=read();
    reg int i,a,b,S=1<<N,s,j,sp;
    for(i=0;i<M;++i) a=read()-1,b=read()-1,mp[a][b]=mp[b][a]=true;
    for(i=0;i<N;++i) id[1<<i]=i;
    for(i=0;i<N;++i)for(j=1;j<S;++j)
        Num[i][j]=Num[i][j-(j&(-j))]+mp[i][id[j&(-j)]];
    for(i=1;i<S;++i) E[i]=E[i-(i&(-i))]+Num[id[i&(-i)]][i-(i&(-i))];
    C[0][0]=1.;
    for(i=1;i<=M;++i)
    {
        C[i][0]=C[i][i]=1.;
        for(j=1;j<i;++j) C[i][j]=C[i-1][j]+C[i-1][j-1];
    }
    for(i=0;i<S;++i) f[0][i]=1;
    for(i=0;i<N;++i) g[0][1<<i]=1,f[0][1<<i]=0;
    for(i=1;i<=M;++i)for(s=0;s<S;++s)if(i<=E[s])
    {
        reg int x=id[s&(-s)];
        for(sp=s-1;sp&=s;--sp)if(sp>>x&1)for(j=0;j<=i;++j)
            f[i][s]+=g[j][sp]*c(E[s-sp],i-j);
        g[i][s]=c(E[s],i)-f[i][s];
    }
    for(i=1;i<=M;++i) ans+=f[i-1][S-1]/c(M,i-1);
    ans/=(double)M+1;
    printf("%.6lf\n",ans);
    return 0;
}


Blog来自PaperCloud,未经允许,请勿转载,TKS!

原文地址:https://www.cnblogs.com/PaperCloud/p/10659294.html

时间: 2024-10-15 13:46:16

「ZJOI2015」地震后的幻想乡的相关文章

「SHOI2016」黑暗前的幻想乡

题目链接 戳我 \(Describe\) \(n?1\)个公司,每个公司能修一些边,求每条边都让不同的公司来修的生成树的方案数 \(Solution\) 这道题很明显容斥.答案就是:所有都选的生成树个数\(-\)一个没选的生成树个数\(+\)两个没选的生成树个数\(-...\) 至于生成树个数怎么算,用\(Matrix - Tree\)矩阵树定理做就好了 如果不会:传送门 \(Code\) #include<bits/stdc++.h> #define int long long #defin

【ZJOI2015】地震后的幻想乡

题面 https://www.luogu.org/problem/P3343 题解 一个几乎显然的暴力做法,枚举每一条边的大小关系,跑$Kruskal$,算出最长的边是第几小的,然后利用“对于$n$个$[0..1]$之间的随机变量$x_1,x_2,...,x_n$,第$k$小的那个的期望值是$\frac{k}{n+1}$”的结论就可以知道这种情况下的时间期望是多少.(虽然这个方法也不是我自己想出来的),这个做法也照应了题面中“当然幽香会先使用一个更加神奇的大魔法来观察出每条边e_i的值,然后再选

[Zjoi2015]诸神眷顾的幻想乡

[Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1537  Solved: 892 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条

【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来.也就是说,这n块空地形成了一个树的结构. 有n个粉丝们来到了太阳花田上.为了表达对幽香生日的祝

字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 843  Solved: 510[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n

BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1017  Solved: 599[Submit][Status][Discuss] Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有

【BZOJ 3926】 [Zjoi2015]诸神眷顾的幻想乡 (广义SAM)

3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 974  Solved: 573 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建

bzoj3925: [Zjoi2015]地震后的幻想乡

Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任务是尽快让幻想乡的交通体系重新建立起来.幻想乡一共有n个地方,那么最快的方法当然是修复n-1条道路将这n个地方都连接起来. 幻想乡这n个地方本来是连通的,一共有m条边.现在这m条边由于地震的关系,全部都毁坏掉了.每条边都有一个修复它需要花费的时间,第i条边所需要的时间为ei.地震发生以后,由于幽香是

BZOJ 3925 Zjoi2015 地震后的幻想乡 期望状压DP

题目大意:给定一张点数不超过10的无向连通图,每条边有一个[0,1]之间的随机权值,求最小生成树上最大边的期望值 此生无悔入东方,来世愿生幻想乡 OTZ 首先既然权值在[0,1]之间均匀分布那么两条边权值相同的概率为0 于是我们只考虑所有边边权都不同的情况 如果最小生成树上的最大边为x,那么权值小于x的边一定不能将这个图连通,而权值<=x的边就可以 因此对于一个x,如果我们求出[只有边权小于x的边存在时这个图不连通]的概率,那么这个概率就是答案>=x的概率 不妨设这个概率为f(x) 那么这个f