30122 - Building a Space station

通过次数

1

提交次数

1

时间限制 : 1 秒
内存限制 : 128 MB

你是空间站工程团队的一员,负责空间站建设过程中的某项任务。你需要写一个程序来完成这项工作。

空间站由若干个单元组成,称为“细胞”。所有细胞都是球形,但大小不一定相同。每个细胞在空间站成功进入轨道后,会固定在预定位置。奇怪的是,两个细胞可能会相互接触,甚至重叠。极端情况下,一个细胞甚至可能完全包裹另一个。我也搞不懂这些奇葩的排列是怎么做到的。

所有细胞必须连通,因为船员需要能从任意一个细胞走到另一个细胞。具体来说,如果满足以下条件之一,船员就能从细胞 A 走到细胞 B

  1. AB 彼此接触或重叠;
  2. AB 之间有一条“走廊”连接;
  3. 存在一个细胞 C,使得从 AC 和从 BC 都能走通。这里条件(3)是传递的。

你的任务是设计走廊的连接方案,也就是决定哪些细胞对之间要建走廊。走廊的设计有一定自由度。比如有三个细胞 ABC,它们彼此不接触也不重叠,至少有三种方案可以让它们连通:第一种是建走廊 A-BA-C,第二种是 B-CB-A,第三种是 C-AC-B。建造走廊的费用跟长度成正比,所以你得选一套总走廊长度最短的方案。

你可以忽略走廊的宽度。走廊连接的是两个细胞表面上的点,长度可以任意长,但当然要选最短的那条。即使两条走廊 A-BC-D 在空间中相交,也不算它们之间形成了通路。换句话说,你可以认为走廊之间永远不会相交。

输入

输入包含多个数据集。每个数据集格式如下:

n x1 y1 z1 r1 x2 y2 z2 r2 ... xn yn zn rn

第一行是一个整数 n,表示细胞数量。n 是正整数,且不超过 100

接下来 n 行,每行描述一个细胞。每行包含四个数字,依次是球心的 xyz 坐标和半径 r。所有数字均为小数,保留三位小数,数字间用空格分隔。

xyzr 都是正数,且小于 100.0

输入以一行单独的数字 0 结束。

输出

对于每个数据集,输出一行,表示所需走廊的最短总长度,保留三位小数。误差不得超过 0.001

如果不需要任何走廊(即所有细胞本身就连通),输出 0.000

样例

输入

3
10.000 10.000 50.000 10.000
40.000 10.000 50.000 10.000
40.000 40.000 50.000 10.000
2
30.000 30.000 30.000 20.000
40.000 40.000 40.000 20.000
5
5.729 15.143 3.996 25.837
6.013 14.372 4.818 10.671
80.115 63.292 84.477 15.120
64.095 80.924 70.029 14.881
39.472 85.116 71.369 5.553
0

输出

20.000
0.000
73.834