P3343-[ZJOI2015]地震后的幻想乡【dp,数学期望】

1|0正题

题目链接:https://www.luogu.com.cn/problem/P3343


1|1题目大意

给出n个点的一张无向图,每条边被修复的时间是[0,1]的一个随机实数,求这张图联通期望时间。

1n10,mn(n1)2


1|2解题思路

这个随机实数好像是用来吓人的(但是概率分布函数好像能搞)

假设修好了k条之后恰好联通了,那么期望需要的时间就是km+1

好了现在要求恰好在k条边修好之后联通的方案,因为每条边修好的先后顺序是完全随机的。

fS,i在生成子图S中修好了i条边是没有联通的方案,gS,i则表示联通了的方案,dS表示生成子图S的边数。

fS,i的话和之前的[集训队作业2013]城市规划思路很向,考虑扩展出一个新的点k,那么我们枚举一个包含k的联通块T(kT,TS),然后合并这个联通块后其他的乱选,就有方程

fS,i=kT,TSj=0min{dT,i}gT,j×(dSTij)

然后gS,i不需要专门的方程因为有fS,i+gS,i=(dSi)

然后答案就是

i=0mim+1(fG,i(dGi)fS,i1(dGi1))=1m+1i=0mfG,i(dGi)

时间复杂度O(3nn2)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=10; ll n,m,e[1<<N],d[1<<N],g[1<<N][N*N/2],f[1<<N][N*N/2],C[51][51]; signed main() { scanf("%lld%lld",&n,&m); for(ll i=1;i<=m;i++){ ll x,y; scanf("%lld%lld",&x,&y); x--;y--;e[(1<<x)|(1<<y)]++; } ll MS=(1<<n); for(ll s=0;s<MS;s++) for(ll t=s;t;t=(t-1)&s) d[s]+=e[t]; C[0][0]=1; for(ll i=1;i<=50;i++) for(ll j=0;j<=50;j++) C[i][j]=(j?C[i-1][j-1]:0)+C[i-1][j]; for(ll s=1;s<MS;s++){ for(ll i=0;i<=d[s];i++){ ll k=s&-s; for(ll t=(s-1)&s;t;t=(t-1)&s) if(t&k) for(ll j=0;j<=min(i,d[t]);j++) f[s][i]+=g[t][j]*C[d[s-t]][i-j]; g[s][i]=C[d[s]][i]-f[s][i]; } } double ans=0; for(ll k=0;k<=m;k++) ans+=(double)f[MS-1][k]/C[m][k]; printf("%.6lf\n",ans/(double)(m+1)); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/14797313.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(55)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示