1

我正在尝试解决以下问题:

在我们的银河系中有 N 颗行星。您可以在不同的行星之间旅行,但并非每个行星都通过安全路线与另一个行星相连。每条路线都有给定的光年长度。你的任务是在一组给定的行星 T(其中 0

输入由 N(行星数量)、R(行星之间安全路线数量)、R 路线组成,形式为三元组 ABL,其中 A 和 B 表示行星的恒星 ID,L 表示它们之间的距离年,T(需要建立基地的行星数量),后面是T数字,代表需要建立基地的行星的ID。

您总是从 ID 为 0 的行星开始。在行星 0 上建立基地可能需要也可能不需要。

我尝试解决这个练习并设法得到一个可行的解决方案,但它太慢了。我使用 Floyd Warshall 算法来获得图中任意两个节点(行星)之间的最小路径。接下来,我找到需要以 0 为基数的最近行星,并计算该路径。然后,我将此行星添加到“访问过的行星”列表中,并将其从“目标”行星列表中删除。我重复这个过程直到最后,但现在我试图找到从目标行星到我访问过的任何行星的最近的行星(因为在它们之间旅行是免费的,我不在乎我最后一次去了哪里)。然后,我添加距离,将其从目标中移除,将其添加到已访问并继续前进,直到建立所有必要的基础。

这提供了正确的输出,但它太慢了。

有什么改进的想法吗?可能是 Dijkstra 算法的一些修改版本?

4

1 回答 1

0

我相信您想要一个由 T 和节点 0(起点)的节点组成的图的最小生成树。节点 T 之间的距离由您计算的最短距离给出。T 中节点之间的确切路径可能会经过 N 中的非 T 点,否则这些点是不相关的。

最小生成树有很多算法。我建议 Kruskal 的算法相当快且相当容易实现。

于 2015-04-07T01:20:38.110 回答