[Codeforces235D]Graph Game——概率与期望+基环树+容斥
题目链接:
题目大意:给出一棵基环树,并给出如下点分治过程,求点数总遍历次数的期望。
点分治过程:
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——概率与期望+基环树+容斥的更多相关文章
- UOJ449. 【集训队作业2018】喂鸽子 [概率期望,min-max容斥,生成函数]
UOJ 思路 由于最近养成的不写代码的习惯(其实就是懒),以下式子不保证正确性. 上来我们先甩一个min-max容斥.由于每只鸽子是一样的,这只贡献了\(O(n)\)的复杂度. 现在的问题转化为对于\ ...
- LOJ2542. 「PKUWC2018」随机游走【概率期望DP+Min-Max容斥(最值反演)】
题面 思路 我们可以把到每个点的期望步数算出来取max?但是直接算显然是不行的 那就可以用Min-Max来容斥一下 设\(g_{s}\)是从x到s中任意一个点的最小步数 设\(f_{s}\)是从x到s ...
- NOIP2019模拟2019.9.20】膜拜大会(外向树容斥,分类讨论)
传送门. 题解: 我果然是不擅长分类讨论,心态被搞崩了. 注意到\(m<=n-2\),意味着除了1以外的位置不可能被加到a[1]两遍. 先考虑个大概: 考虑若存在\(x,x-1,-,2\)(有序 ...
- P4707-重返现世【dp,数学期望,扩展min-max容斥】
正题 题目链接:https://www.luogu.com.cn/problem/P4707 题目大意 \(n\)个物品,每次生成一种物品,第\(i\)个被生成的概率是\(\frac{p_i}{m}\ ...
- 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]
传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...
- luogu 4927 [1007]梦美与线段树 概率与期望 + 线段树
考场上切了不考虑没有逆元的情况(出题人真良心). 把概率都乘到一起后发现求的就是线段树上每个节点保存的权值和的平方的和. 这个的修改和查询都可以通过打标记来实现. 考场代码: #include < ...
- hdu6059 Kanade's trio 字典树+容斥
转自:http://blog.csdn.net/dormousenone/article/details/76570172 /** 题目:hdu6059 Kanade's trio 链接:http:/ ...
- [51Nod1446] 限制价值树 (容斥+MT定理+折半搜索)
传送门 Description 有N个点(N<=40)标记为0,1,2,...N-1,每个点i有个价值val[i],如果val[i]=-1那么这个点被定义为bad,否则如果val[i] > ...
- HDU - 4336:Card Collector(min-max容斥求期望)
In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...
随机推荐
- Chrome 谷歌浏览器清除HTTPS证书缓存
在地址栏输入 chrome://net-internals/#hsts 找到下图中的输入框,输入对于的域名执行删除就行了
- Python实现将爱词霸每日一句定时推送至微信
前言 前几天在网上看到一篇文章<教你用微信每天给女票说晚安>,感觉很神奇的样子,随后研究了一下,构思的确是巧妙.好,那就开始动工吧!服务器有了,Python环境有了,IDE打开了...然而 ...
- 跨域访问-需要设置HTTP响应标头
前提:服务端网站的配置(被请求的网站) 1.需要在IIS服务器站点的功能视图中设置HTTP响应标头: 2.双击“HTTP响应标头”进入设置界面 3.点击右侧添加按钮弹出窗口 4.填入需要设置的信息 名 ...
- Windows Community Toolkit 3.0 - UniformGrid
概述 UniformGrid 控件是一个响应式的布局控件,允许把 items 排列在一组均匀分布的行或列中,以填充整体的可用显示空间,形成均匀的多个网格.默认情况下,网格中的每个单元格大小相同. 这是 ...
- logstash采集与清洗数据到elasticsearch案例实战
原文地址:https://www.2cto.com/kf/201610/560348.html Logstash的使用 logstash支持把配置写入文件 xxx.conf,然后通过读取配置文件来采集 ...
- abbix通过JMX监控Tomcat(被监控端安装Tomat的服务器防火墙策略iptables配置)
原文地址:http://jaychang.iteye.com/blog/2214830 一.目前的环境 被监控端192.168.153.191 /usr/local/tomcat 下载了catalin ...
- GitHub上README.md编写教程(基本语法)
一.标题写法: 第一种方法: 1.在文本下面加上 等于号 = ,那么上方的文本就变成了大标题.等于号的个数无限制,但一定要大于0个哦.. 2.在文本下面加上 下划线 - ,那么上方的文本就变成了中标题 ...
- sql存储过程中使用 output、nvarchar(max)
1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...
- heb Daz
Asatras soi bib Daz! gos la haik ri, dewoa gos mi haik quri. soi Fong d cuup va ti Chusan, imps Dabo ...
- 007-迅雷定时重启AutoHotkey脚本-20190411
;; 定时重启迅雷.ahk,;;~ 2019年04月11日;#SingleInstance,forceSetWorkingDir,%A_ScriptDir%DetectHiddenWindows,On ...