CF235D-Graph Game【LCA,数学期望】

1|0正题

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


1|1题目大意

给出一棵基环树,每次随机选择一个点让权值加上这个点的连通块大小然后删掉这个点。

求删光所有点时期望权值。

1n3000


1|2解题思路

先找到环,然后考虑暴力枚举点对(x,y)计算贡献,即统计在x删除时与y连通的概率。

如果他们之间的路径没有经过环,那么显然这个概率是1|p|x必须是第一个删除的。

如果他们之间的路径有环,那么这样就会产生两条路径,概率计算后要容斥减去即产生贡献

1|p1|+1|p2|1|p1p2|

写个LCA就好了,时间复杂度O(n2logn)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=3100,T=12; struct node{ int to,next; }a[N<<1]; int n,tot,cnt,ls[N],cir[N],root[N],dep[N],f[N][T+1]; bool v[N];double ans; void addl(int x,int y){ a[++tot].to=y; a[tot].next=ls[x]; ls[x]=tot;return; } int dfs(int x,int fa){ v[x]=1; for(int i=ls[x];i;i=a[i].next){ int y=a[i].to; if(y==fa)continue; if(v[y]){ root[++cnt]=x;cir[x]=cnt; return y; } int z=dfs(y,x); if(z==-1)return -1; if(z){ root[++cnt]=x;cir[x]=cnt; if(z==x)return -1; return z; } } return 0; } void Dfs(int x){ for(int i=ls[x];i;i=a[i].next){ int y=a[i].to; if(cir[y])continue; cir[y]=cir[x]; dep[y]=dep[x]+1; f[y][0]=x;Dfs(y); } return; } int LCA(int x,int y){ if(dep[y]>dep[x])swap(x,y); for(int i=T;i>=0;i--) if(dep[f[x][i]]>=dep[y])x=f[x][i]; if(x==y)return x; for(int i=T;i>=0;i--) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; return f[x][0]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ int x,y; scanf("%d%d",&x,&y);x++;y++; addl(x,y);addl(y,x); } dfs(1,0); for(int i=1;i<=cnt;i++) dep[root[i]]=1,Dfs(root[i]); for(int j=1;j<=T;j++) for(int i=1;i<=n;i++) f[i][j]=f[f[i][j-1]][j-1]; for(int x=1;x<=n;x++) for(int y=1;y<=n;y++){ if(cir[x]==cir[y]){ int lca=LCA(x,y); ans+=1/(1.0*(dep[x]+dep[y]-dep[lca]*2+1)); } else{ int len3=dep[x]+dep[y]; int len1=abs(cir[x]-cir[y]); int len2=cnt-len1; len1+=len3-1;len2+=len3-1;len3+=cnt-2; ans+=1.0/(double)len1+1.0/(double)len2-1.0/(double)len3; } } printf("%.12lf\n",ans); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15169683.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(79)  评论(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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示