3032: 点分治
内存限制:256 MB
时间限制:2.000 S
评测方式:文本比较
命题人:
提交:0
解决:
题目描述
在计算机科学领域中,有一种解决复杂树链问题的算法叫做”点分治”,让我们来定义一下这个算法的流程:
solve(T):
1 选择一个树 T 上的节点 x (通常为这棵树的重心),我们将其称为第一步。
2 处理所有经过点 x 的路径。
3 从树 T 中删除点 x。
4 树 T 被分裂成若干子树。
5 分治处理所有分裂出的子树 S,solve(S)。
现在小 G 错误地认为第一步中选择任何一点都是可行的,所以他在第一步中随机取点。为了使情况更糟糕,他认为一棵”树”应该满足边数和点数相
等。所以它的分治过程变成这样:
定义一个变量 totalCost, 初始 totalCost = 0,然后,solve(T)(T现在是个图)
1 totalCost = totalCost + (size of T),(size of T) 表示图T中的节点个数。
2 在图T中随机选择一个节点 x (每个点被选中的概率相等)。
3 在图中删除节点 x。
4 图被分裂为几个连通块。
5 分治处理所有的子连通块,solve(S),其中 S 是分裂出的连通块。
小G将新的 solve 函数用于一个 n 个点 n 条边的连通图,结果运行速度与他的想象大大相反,现在他想知道这个连通图运行这个新算法后,变量 totalCost 的数学期望,以便他研究,你能帮助他吗?
输入
第一行一个整数 n,表示图中点的数量和边的数量。
接下来 n 行,每行两个空格隔开的整数 ai, bi,表示一条 (ai, bi) 的无向边。
节点从 0 开始编号。
输出
仅一行输出一个实数,表示 totalCost 的数学期望。和标准答案绝对误差或相对误差在 10-1 以内都被认为正确。
样例输入 复制
[Sample 1]
5
3 4
2 3
2 4
0 4
1 2
[Sample 2]
3
0 1
1 2
0 2
样例输出 复制
[Sample 1]
13.1666666666
[Sample 2]
6.0000000000
提示
30%的数据:n ≤ 10
60%的数据:n ≤ 100
100%的数据:n ≤ 3000