《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;
}
相关推荐
find1star7 分钟前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing14 分钟前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB211224 分钟前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP2 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN2 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218312 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤3 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate3 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran3 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹4 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统