#P2031. Building a Space Station

Building a Space Station

题目描述

你是空间站工程团队的一员,负责在空间站建造过程中完成一项编程任务。

空间站由多个单元舱(cell)组成,所有单元舱均为球形,但尺寸不一定相同。每个单元舱在空间站成功入轨后即被固定在预定位置。奇特的是,两个单元舱可能相互接触甚至部分重叠,极端情况下一个单元舱可能完全包裹另一个单元舱。

所有单元舱必须保持连通性,以确保宇航员能在任意两个单元舱之间通行。通行规则如下:

  1. 直接连通:单元舱AABB接触或重叠。
  2. 走廊连接:通过建造**走廊(corridor)**连接AABB
  3. 间接连通:存在单元舱CC,使得AACCBBCC均连通(满足传递性)。

任务要求

设计走廊的连接方案,使得:

  • 所有单元舱连通。
  • 总走廊长度最短(走廊成本与其长度成正比)。
  • 走廊可视为无宽度的直线,连接两单元舱表面,且长度取最短可能值
  • 若无需走廊即可连通(如所有单元舱已直接接触/重叠),输出0.0000.000

输入格式

  • 每个测试用例格式如下:
    n
    x1 y1 z1 r1
    x2 y2 z2 r2
    ...
    xn yn zn rn
    
    • nn:单元舱数量(1n1001 \leq n \leq 100)。
    • xi,yi,zix_i, y_i, z_i:第ii个单元舱中心的三维坐标(保留33位小数)。
    • rir_i:第ii个单元舱的半径(保留33位小数)。
    • 坐标和半径均为正数且小于100.0100.0
  • 输入以单独一行的00结束。

输出格式

对每个测试用例,输出一行:最短走廊总长度(保留33位小数,误差不超过0.0010.001)。

样例输入

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