我正在尝试解决以下问题:
我们银河系中有N个行星。你可以在不同的行星之间旅行,但不是每个行星都通过安全的路线与另一个行星相连。每条路线都有一个特定的光年长度。你的任务是在一组给定的行星T(其中为0)上建立基础
输入包括N(行星的数量),R(行星之间的安全路线的数量),形式为三角形ABL的R路线,其中A和B代表行星的恒星ID,和表示它们之间在光年中的距离,T(需要建立基准的行星数),然后是T数,表示需要建立基地的行星的ID。
你总是从ID为0的行星开始。可能需要也可能不需要在行星0上建立基地。
我尝试解决这个练习,并设法找到一个有效的解决方案,但它太慢了。我使用Floyd Warshall算法在图中的任意两个节点(行星)之间获得最小路径。接下来,我找到需要基数为0的最近行星,并计算该路径。然后,我将这个星球添加到“访问过的行星”列表中,并将其从“目标”行星列表中删除。我重复这个过程直到结束,但现在我试图找到离目标行星最近的行星到我所访问过的行星中的任何一个(因为它们之间的旅行是免费的,我不在乎我最后的位置)。然后,我添加距离,将其从目标移除,将其添加到访问并继续前进,直到我建立所需的每个基础。
这提供了正确的输出,但速度太慢。
有任何改进的想法吗?可能是Dijkstra算法的一些改进版本?
答案 0 :(得分:0)
我相信你想要一个由T和节点0(起始点)的节点组成的最小生成树。节点T之间的距离由您计算的最短距离给出。 T中节点之间的确切路径可以通过N中的非T点,但是否则这些点是无关紧要的。
有许多用于最小生成树的算法。我建议Kruskal的算法合理快速且相当容易实现。