《CF280C Game on Tree》

题目描述

给定一棵有根树,结点编号从 1 到 n。根结点为 1 号结点。

对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后,游戏结束;也就是说,删除 1 号结点后游戏即结束。

要求求出删除所有结点的期望操作次数。

输入格式

第一行,一个正整数 n 表示结点数量。

接下来 n−1 行每行两个数,表示树上的一条连接 ai​ 与 bi​ 的边 (ai​,bi​)。

保证给定的数据是一棵树。

输出格式

输出一个实数,表示期望操作次数。答案误差在 10−6 之内则认为正确。

显示翻译

题意翻译

输入输出样例

输入 #1复制

复制代码
2
1 2

输出 #1复制

复制代码
1.50000000000000000000

输入 #2复制

复制代码
3
1 2
1 3

输出 #2复制

复制代码
2.00000000000000000000

说明/提示

样例解释

在第一个样例中,有两种情况:

一种是直接删除根(即 1 号结点),另一种是先删去 2 号结点,再删除 1 号结点。

操作次数的期望是 1×21​+2×21​=1.5。

在第二个样例中,情况更为复杂。其中有两种情况会将问题转化成第一个样例,而剩下的一种情况会一次全部删除。

操作次数的期望是 1×31​+(1+1.5)×32​=31​+35​=2。

数据范围

1≤n≤105,1≤ai​,bi​≤n,ai​=bi​

代码实现:

cpp 复制代码
#include<stdio.h>
const int N=100005,M=200005;
int n,c;
int h[N],v[M],nxt[M],d[N];
double res;
inline void add(int x,int y){
	nxt[++c]=h[x],h[x]=c,v[c]=y;
}
void dfs(int x,int fa){
	d[x]=d[fa]+1;
	for(int i=h[x];i;i=nxt[i]){
		int y=v[i];
		if(y==fa)
			continue;
		dfs(y,x);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y),add(y,x);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)
		res+=1.0/d[i];
	printf("%.20f\n",res);
	return 0;
}
相关推荐
深邃-42 分钟前
【数据结构与算法】-二叉树(2):实现顺序结构二叉树(堆的实现),向上调整算法,向下调整算法,堆排序,TOP-K问题
数据结构·算法·二叉树·排序算法·堆排序··top-k
We་ct4 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
王老师青少年编程8 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮8 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说8 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
wuweijianlove9 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung10 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了10 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL10 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化
谭欣辰10 小时前
C++ 排列组合完整指南
开发语言·c++·算法