题目链接:

Codeforces235D

题目大意:给出一棵基环树,并给出如下点分治过程,求点数总遍历次数的期望。

点分治过程:

1、遍历当前联通块内所有点

2、随机选择联通块内一个点删除掉

3、对新形成的联通块进行点分治

我们设$P(A,B)$表示当删除$A$时$A,B$连通的概率,显然以$A$为分治中心时会遍历到$B$的概率为$P(A,B)$。

那么答案就是$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}P(i,j)$。

我们先考虑树的情况:

设$A,B$路径上点数(包括$A,B$)为$n$,那么$P(A,B)=\frac{1}{n}$,我们可以用数学归纳法证明:

假设当前$A,B$所处的联通块为$G$且$G$的点数为$x$。

当$n=x$时,即$G$为从$A$到$B$的链,显然只有选$A$为下一个分治中心才能使以$A$为分治中心时会遍历到$B$,所以概率是$\frac{1}{n}$

当$x>n$时,我们假设已经证明$G$的所有包含$A,B$的子联通块的$P(A,B)=\frac{1}{n}$,那么如果这次选取的分治中心在$(A,B)$路径上,概率是$\frac{n}{x}*\frac{1}{n}=\frac{1}{x}$;如果不在$(A,B)$路径上,因为删除这次选取的分治中心后$A,B$所在联通块的$P(A,B)=\frac{1}{n}$,所以概率为$\frac{x-n}{x}*\frac{1}{n}$,两种情况概率相加为$\frac{1}{n}$。

现在再来考虑基环树的情况:

如果$(A,B)$路径不经过环,那么按树的结论解决。

如果$(A,B)$路径经过环,如下图所示。

设橙色点数量为$X$,那么要保证选$A$作为分治中心之前不选橙色点作为分治中心且蓝色点(设数量为$Y$)或绿色点(设数量为$Z$)要有一组点都不在$A$之前作为分治中心,我们分别求出保留橙色点与蓝色点和橙色点与绿色点时的概率再减掉同时保留三个颜色点的概率即为$P(A,B)$,即$P(A,B)=\frac{1}{X+Y}+\frac{1}{X+Z}-\frac{1}{X+Y+Z}$。

将基环树看作是一个环的每个点上挂着一棵树,我们$O(n^2)$枚举两个点判断是否属于一棵树中并计算两点间距离即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int head[5010];
int from[5010];
int to[100010];
int nex[100010];
int dep[5010];
int q[5010];
int cnt;
int vis[5010];
int bel[5010];
int num[100010];
double ans;
int tot;
int x,y,n,m;
int f[5010][17];
void add(int x,int y,int z)
{
nex[++tot]=head[x];
head[x]=tot;
to[tot]=y;
num[tot]=z;
}
bool dfs(int x,int fa)
{
vis[x]=1;
for(int i=head[x];i;i=nex[i])
{
if(num[i]!=fa)
{
if(vis[to[i]])
{
for(int j=x;j!=to[i];j=from[j])
{
q[++cnt]=j;
}
q[++cnt]=to[i];
return true;
}
else
{
from[to[i]]=x;
if(dfs(to[i],num[i]))
{
return true;
}
}
}
}
return false;
}
void find(int x,int fa,int rt)
{
bel[x]=rt;
dep[x]=dep[fa]+1;
f[x][0]=fa;
for(int i=1;i<=15;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
for(int i=head[x];i;i=nex[i])
{
if(to[i]!=fa&&!vis[to[i]])
{
find(to[i],x,rt);
}
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])
{
swap(x,y);
}
int d=dep[x]-dep[y];
for(int i=0;i<=15;i++)
{
if(d&(1<<i))
{
x=f[x][i];
}
}
if(x==y)
{
return x;
}
for(int i=15;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++)
{
scanf("%d%d",&x,&y);
x++,y++;
add(x,y,i);
add(y,x,i);
}
dfs(1,0);
memset(vis,0,sizeof(vis));
for(int i=1;i<=cnt;i++)
{
vis[q[i]]=1;
}
for(int i=1;i<=cnt;i++)
{
find(q[i],0,i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(bel[i]==bel[j])
{
ans+=(double)1/(dep[i]+dep[j]-2*dep[lca(i,j)]+1);
}
else
{
int X=dep[i]+dep[j];
int Y=abs(bel[i]-bel[j])-1;
int Z=cnt-Y-2;
ans+=(double)1/(X+Y)+(double)1/(X+Z)-(double)1/(X+Y+Z);
}
}
}
printf("%.7f",ans);
}

[Codeforces235D]Graph Game——概率与期望+基环树+容斥的更多相关文章

  1. UOJ449. 【集训队作业2018】喂鸽子 [概率期望,min-max容斥,生成函数]

    UOJ 思路 由于最近养成的不写代码的习惯(其实就是懒),以下式子不保证正确性. 上来我们先甩一个min-max容斥.由于每只鸽子是一样的,这只贡献了\(O(n)\)的复杂度. 现在的问题转化为对于\ ...

  2. LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】

    题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...

  3. NOIP2019模拟2019.9.20】膜拜大会(外向树容斥,分类讨论)

    传送门. 题解: 我果然是不擅长分类讨论,心态被搞崩了. 注意到\(m<=n-2\),意味着除了1以外的位置不可能被加到a[1]两遍. 先考虑个大概: 考虑若存在\(x,x-1,-,2\)(有序 ...

  4. P4707-重返现世【dp,数学期望,扩展min-max容斥】

    正题 题目链接:https://www.luogu.com.cn/problem/P4707 题目大意 \(n\)个物品,每次生成一种物品,第\(i\)个被生成的概率是\(\frac{p_i}{m}\ ...

  5. 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]

    传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...

  6. luogu 4927 [1007]梦美与线段树 概率与期望 + 线段树

    考场上切了不考虑没有逆元的情况(出题人真良心). 把概率都乘到一起后发现求的就是线段树上每个节点保存的权值和的平方的和. 这个的修改和查询都可以通过打标记来实现. 考场代码: #include < ...

  7. hdu6059 Kanade's trio 字典树+容斥

    转自:http://blog.csdn.net/dormousenone/article/details/76570172 /** 题目:hdu6059 Kanade's trio 链接:http:/ ...

  8. [51Nod1446] 限制价值树 (容斥+MT定理+折半搜索)

    传送门 Description 有N个点(N<=40)标记为0,1,2,...N-1,每个点i有个价值val[i],如果val[i]=-1那么这个点被定义为bad,否则如果val[i] > ...

  9. HDU - 4336:Card Collector(min-max容斥求期望)

    In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...

随机推荐

  1. 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

    在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有 ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 树形选择项目的标准例子

    用成套的现成的方法引导大家开发程序,整个团队的开发效率会很高.例如我们现在有30多个开发人员,若有300个开发人员,这开发工作很容易乱套,我们需要有效的管理维护所有团队的开发工作.把数据结构.通用的组 ...

  3. 小L的试卷

    题目描述 小L期末考试结束,高高兴兴放假回家了,可是那么多试卷,老师还要加班批改,有n份试卷由k个老师批改,n份试卷进行了密封编号,由于试卷上的做题情况和书写的规范程序不一样,批改不同的试卷用时也可能 ...

  4. 设计模式——MVC MVP MVVM

    了解到Vue是MVVM前端框架, 中午就研究了一下MVVM,但要从MVC开始说起: M(Model):模型,提供数据: V(View):视图,负责显示: C(Controller):控制器,负责逻辑处 ...

  5. 书城项目第五阶段---book表的curd

    JavaEE三层架构分析 MVC

  6. ModelAttribute用法之一

    @ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子   package com.my.controller; import java.util.ArrayList ...

  7. adb通过wifi连接android设备

    问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...

  8. JEECG框架中使用Flash版本Uploadify,在Chrome版本号70下无法启动的解决办法

    感谢文章:https://www.cnblogs.com/zinan/p/6902427.html 单独打开IFRAME中的页面 点击导航栏的<不安全> 再刷新单独IFRAME的页面,就可 ...

  9. 测试python最大递归层次

    转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...

  10. eclipse 中右键项目出现卡死导致无法共享项目的解决办法

    亲身经历,这个问题出自于项目中的SVN地址不对,如果要更改SVN地址,可以断掉计算机的网,在eclipse的工作空间中找到该项目,找到隐藏的.svn 文件夹,删除掉之后,打开eclipse,此时就可以 ...