正题

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


题目大意

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

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

\(1\leq n\leq 3000\)


解题思路

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

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

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

\[\frac{1}{|p_1|}+\frac{1}{|p_2|}-\frac{1}{|p_1\cup p_2|}
\]

写个\(LCA\)就好了,时间复杂度\(O(n^2\log n)\)


code

#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;
}

CF235D-Graph Game【LCA,数学期望】的更多相关文章

  1. [BZOJ 3143][HNOI2013]游走(数学期望)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3143 分析: 易得如果知道了每条边经过的数学期望,那就可以贪心着按每条边的期望的大小赋 ...

  2. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum (数学期望)

    题目链接 题意 : 一个m面的骰子,掷n次,问得到最大值的期望. 思路 : 数学期望,离散时的公式是E(X) = X1*p(X1) + X2*p(X2) + …… + Xn*p(Xn) p(xi)的是 ...

  3. 数学期望和概率DP题目泛做(为了对应AD的课件)

    题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C & ...

  4. [2013山东ACM]省赛 The number of steps (可能DP,数学期望)

    The number of steps nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; ...

  5. 【BZOJ2134】单位错选(数学期望,动态规划)

    [BZOJ2134]单位错选(数学期望,动态规划) 题面 BZOJ 题解 单独考虑相邻的两道题目的概率就好了 没了呀.. #include<iostream> #include<cs ...

  6. 【BZOJ1415】【NOI2005】聪聪和可可(动态规划,数学期望)

    [BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include< ...

  7. 【Luogu1291】百事世界杯之旅(动态规划,数学期望)

    [Luogu1291]百事世界杯之旅(动态规划,数学期望) 题面 洛谷 题解 设\(f[i]\)表示已经集齐了\(i\)个名字的期望 现在有两种方法: 先说我自己的: \[f[i]=f[i-1]+1+ ...

  8. 【BZOJ4872】分手是祝愿(动态规划,数学期望)

    [BZOJ4872]分手是祝愿(动态规划,数学期望) 题面 BZOJ 题解 对于一个状态,如何求解当前的最短步数? 从大到小枚举,每次把最大的没有关掉的灯关掉 暴力枚举因数关就好 假设我们知道了当前至 ...

  9. 【BZOJ3143】游走(高斯消元,数学期望)

    [BZOJ3143]游走(高斯消元,数学期望) 题面 BZOJ 题解 首先,概率不会直接算... 所以来一个逼近法算概率 这样就可以求出每一条边的概率 随着走的步数的增多,答案越接近 (我卡到\(50 ...

随机推荐

  1. ReentrantLock中的Condition(等待和唤醒)

    Condition 类的 awiat 方法和 Object 类的 wait 方法等效 Condition 类的 signal 方法和 Object 类的 notify 方法等效 Condition 类 ...

  2. SpringBoot监听redis过期key

    开启过期监听 vim /etc/redis.conf 取消notify-keyspace-events Elg的注释 pom.xml 添加: <dependency> <groupI ...

  3. WPF---数据绑定之ItemsControl(三)

    一.Combox绑定 场景:定义多个Person,Person有Name和Age属性,将多个Person与Combox进行绑定,Combox中只显示Name信息,点击任意一个item,在左侧显示该条目 ...

  4. Python打印图片

    准备好图片:(我女票) python代码: # by gubin 6.20 from dyy from PIL import Image import sys import os def _main( ...

  5. docker安装与配置nginx详细过程

    注:大鸟飞过,此方式只用于快速搭建使用 第一步 pull nginx 命令:docker pull nginx 第二步 启动nginx 命令:docker run --name nginx -p 80 ...

  6. Vue.JS快速上手(Vue-router 实现SPA 开发)

    一.什么是路由 URL -> 映射 -> 组件 Hash+onhashchange History.pushstate+replaceState+onpopstate 二.准备工作 组件 ...

  7. indexedDB数据库完整创建流程

    1.打开数据库 使用 IndexedDB 的第一步是打开数据库,使用indexedDB.open()方法 var request = window.indexedDB.open(databaseNam ...

  8. “类型思维”之Typescript,你掌握了吗?

    (一)背景 JavaScript是一门动态弱类型语言 对变量的类型非常宽容 而且不会在这些变量和它们的调用者之间建立结构化的契约. 试想有这么几个场景: 1: 你调用一个别人写的函数,但是这个人没有写 ...

  9. Java - 记录01_开发环境搭建

    时间:2017-07-04 记录:byzqy 一.什么是JDK JDK(Java Development Kit):Java开发工具集,即Java语言的软件开发工具包. SDK(Software De ...

  10. 阿里云服务器部署mongodb

    在阿里云上买了个服务器,部署mongodb遇到一些坑,解决办法也是从网上搜集而来,把零零碎碎的整理记录一下. 服务器是:Alibaba Cloud Linux 下载安装 mongodb官网下载实在是太 ...