最短连接算法,智力游戏

The shortest connection algorithm, mind game

这是智力游戏书中的一道题。我试过这样解决它 (http://pastebin.com/sdfcuxW1) 但没有运气。它还必须非常优化以在 4 秒内处理 2000 个输入坐标的输出。

任何关于我的代码的建议,或任何新的算法想法都会非常有帮助。

问题: 我们有一个坐标平面,我们只使用第一象限。我们提供了许多坐标,每个坐标都带有 +X 和 +Y 值。例如0,2 - 5,4等。我们需要将这些坐标中的每一个都与矩形连接起来(矩形的一个角接触一个坐标,另一个角接触另一个坐标),以便所有坐标都相互接触(没有遗漏)。我们还必须确保我们用来连接我们的 2 个坐标的矩形不与任何其他坐标重叠(在边缘上很好)。鉴于目标是尽可能使用最小的总矩形面积,什么样的算法可以打印出这个问题的最佳解决方案。

http://cl.ly/image/1P012s3p1E1g 紫色区域是矩形,绿点是坐标。我们可以拥有宽度为 0 的矩形,不占用任何面积。

我想不通的是:找到最接近我们起始坐标的坐标很容易。但很难确保所有坐标都连接在一起。我总是得到漂浮在飞机不同区域的坐标。我的代码也滞后了 >1000 分。

这是一个解决方案:

  1. 让我们将此问题建模为图形问题。

  2. 顶点是给定的点。

  3. 每对顶点之间都有一条边。这条边的权重就是这对点组成的矩形的面积。

  4. 答案就是这个图中的最小生成树。我们可以使用Prim的算法来找到它。

这个解的时间复杂度是O(n ^ 2)

唯一的问题是:为什么这个算法生成的矩形不能包含另一个点?这里我不会post一个正式的证明,但是画一些图可以看出,如果有这样一个矩形,解决方案不是最优的(证明的想法:假设里面有一个点。我们可以拆分这个矩形一分为二,使这个点成为他们的一个角。执行此操作后总面积只能减少)。