首页 > 其他分享 >CF1060F Shrinking Tree

CF1060F Shrinking Tree

时间:2024-07-28 12:09:59浏览次数:10  
标签:概率 删除 int 51 Tree siz 条边 CF1060F Shrinking

考虑分别以每个点为根计算概率,可以计算所有边固定了收缩顺序的概率之和后除以 \((n-1)!\) 即为答案

设 \(f_{x,i}\) 表示在 \(x\) 的子树内,删除最后 \(i\) 条边前后根的编号不发生变化的概率和,所求即为 \(f_{rt,n-1}\)

记当前点为 \(v\),父节点为 \(u\),因为收缩 \((u,v)\) 时,之前的编号是随意的,之后相当于 \(v\) 变成了 \(u\),后面剩下的边就不能将 \(v\) 删除掉,所以这样设计状态

考虑从 \(f_v \to f_u\)

首先需要在 \(f_v\) 的基础上添加 \((u,v)\),转移到 \(g_j\),但是表示是 \(v\) 子树内的边和 \((u,v)\) 中删除最后 \(j\) 条边前后父节点代表的根不发生变化的概率,枚举 \((u,v)\) 是从后向前第 \(i\) 条边删除的,若 \(i \le j\),首先需要保留 \(u\),而且后面的边已经与 \(u\) 相连(可看作 \(v\) 变成了 \(u\)),所以后面的 \(i-1\) 条边也是让它被保留的,那么贡献为 \(\frac{f_{v,i-1}}{2}\),否则是不会对 \(j\) 之内的直接产生影响,只需要确保后来没被覆盖即可,所以贡献为 \(f_{y,j}\)

再考虑合并所有的 \(v\),相当于是将 \(u\),\(v\) 的后面确定的 \(j\) 条边合并起来和前面的合并起来分别的方案的乘积,所以贡献是 \(f_{u,i}f_{v,j}\tbinom{i+j}{j}\tbinom{siz_u +siz_v-i-j}{siz_v-j}\)

#include<bits/stdc++.h>
using namespace std;
int n,x,y,siz[51];
double fac=1,f[51][51],g[51],h[51],c[101][101];
vector <int> G[51];
void dfs(int x,int u){
	siz[x]=1,f[x][0]=1;
	for(int y:G[x]){
		if(y==u) continue;
		dfs(y,x);
		memset(g,0,sizeof(g));
		for(int i=1;i<=siz[y];i++){
			for(int j=0;j<=siz[y];j++){
				if(i<=j) g[j]+=f[y][i-1]/2;
				else g[j]+=f[y][j];
			}
		}
		for(int i=0;i<siz[x];i++) for(int j=0;j<=siz[y];j++) h[i+j]+=f[x][i]*g[j]*c[i+j][j]*c[siz[x]+siz[y]-1-i-j][siz[y]-j];
		siz[x]+=siz[y];
		for(int i=0;i<siz[x];i++) f[x][i]=h[i],h[i]=0;
	}
}
int main(){
    scanf("%d",&n);
	for(int i=1;i<n;i++) fac*=i;
	for(int i=0;i<=n*2;i++){
		c[i][0]=1;
		for(int j=1;j<=i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1];
	}
	for(int i=2;i<=n;i++){
		scanf("%d%d",&x,&y);
		G[x].push_back(y);
		G[y].push_back(x);
	}
	for(int i=1;i<=n;i++){
		memset(f,0,sizeof(f));
		dfs(i,0);
		printf("%.10lf\n",f[i][n-1]/fac);
	}
	return 0;
}

标签:概率,删除,int,51,Tree,siz,条边,CF1060F,Shrinking
From: https://www.cnblogs.com/zyxawa/p/18328056

相关文章

  • lxml.etree 元素在副本上删除命名空间
    我正在使用lxml.etree库将XML文件拼接在一起,并且命名空间在写入时被删除。Input.xml<?xmlversion="1.0"encoding="UTF-8"?><haul><uuid>abc</uuid><portxmlns="hello"xmlns:a="hello">......
  • Fenwick Tree
    看这篇题解解释一下是为什么看蓝书的图,比如\(a_3\)对\(c_8\)的贡献,操作一次,贡献系数为\(1\),然后将\(a_8\)中\(a_3\)的贡献次数改为\(1\),考虑一下操作第二次在干什么,我们是先更新了\(a_3\)对\(c_4\)的贡献,然后让\(c_8\)为\(c_4\)和\(a_8\)(注意这里的\(a_8\)已经不是最开始的\(a_8......
  • MySQL索引详解full-text,b-tree,hash,r-tree
    一、MySQL索引类型mysql里目前只支持4种索引分别是:full-text,b-tree,hash,r-treeb-tree索引应该是mysql里最广泛的索引的了,除了archive基本所有的存储引擎都支持它.1.full-text索引full-text在mysql里仅有myisam支持它,而且支持full-text的字段只有char、varchar、text数据类型......
  • 使用 ElementTree 库解析 KML/XML
    我想利用ElementTreepython库解析SimpleData标签中找到的“ID2”名称属性。<Placemark><ExtendedData><SchemaData><SimpleDataname="ID1">123456</SimpleData><SimpleDataname="ID2">......
  • 索引结构—B+Tree索引、Hash索引、Full-Text(全文)索引、R-Tree(空间)索引
    一、概述在数据库系统中,索引是一种用于加快数据检索的数据结构。不同的索引结构适用于不同的查询场景和数据特性。索引按照不同角度可以划分不同类型的索引。按照数据结构可以划分B+Tree索引、Hash索引、FULLTEXT(全文)索引、R-Tree(空间)索引二、索引结构mysql的索引是作用于......
  • xml.etree.ElementTree 文档中文翻译; SVG矢量图;Python标准库
    更新中..简介xml.etree.ElementTree实现了一个简洁有效的用于解析和新建XML数据的API。其也被简称为ET。弃用:xml.etree.cElementTree自Python==3.3已被弃用警告:使用时需注意恶意构建的数据,请防范XML漏洞概念XML是一种继承性的分层数据格式,常用树来表示。ET有两个类,Ele......
  • QTreeView 样式设置以及Checkbox复选框样式设置
    这种样式设置如下QTreeView{background:#303033;font-size:16px;color:rgba(255,255,255,1);border:0px;}QTreeView::item{background:#303033;height:40px;}QTreeView::branch{background:#303033;}QTreeView::item:hover{......
  • Jax 抖动 kd-tree 代码需要花费相当长的时间
    我已经把自己陷入了以下情况的困境:我正在运行一个需要平滑渐变才能工作的优化器,并且我正在使用Jax进行自动微分。由于此代码是Jaxjitted,这意味着连接到它的任何内容都必须是Jaxjit可追踪的。我需要插入一个函数以与优化器一起使用,但不能使用Scipy库,因为它......
  • KD-Tree 学习笔记
    学习资料:1.B站-一只叫小花的猫2.语雀-双愚:kdtree3.B站视频:学习kdtree的前置知识:KNN算法KD树简介与背景  k-d树,是一种分割k维数据空间的数据结构。主要应用于多维空间关键数据的搜索。关于kd树的背景,它主要是一种解决特征点匹配问题的算法,kd树就是一种高维空间索引结构......
  • SourceTree账号密码问题,弹出提示框提示输入密码
      在新项目或者clone来的项目中,执行pull的时候需要强制输入用户名密码。但是此时如果你的用户名输入错误,那么就一直这么错误的存储住,然后无法更改,移除标签也不能做到重新清空。会一直错下去。以下是解决问题的过程:1.因为git是企业私有托管,我以为是SourceTree在钥匙串管......