计算多点之间的最短距离

时间:2015-11-30 20:50:19

标签: algorithm

所以这就是我遇到的问题:我需要一个算法,给定一组n坐标点(x;y)什么是将所有点链接在一起的最短路径,没有限制所有,意味着单个点可以链接到任意数量的其他点。

解决问题的第一个想法是每个未链接的点,找到最近的点并链接到它,然后从未链接的点列表中删除这两个点并重新开始直到你没有更多的不相关点。您已在此阶段创建了近点积木。然后链接那些找到它们之间最短距离的块。

这个方法的问题是1.它没有给出最短的路径2.它看起来效率很低,所以我问你,这种算法是什么类型的算法(我只需要点之间的总距离,我不关心它们实际上是如何联系的?)

2 个答案:

答案 0 :(得分:1)

听起来好像你可以使用生成树算法。在伪代码中:

build_tree(unconnected_nodes):
  connected_nodes = set()
  // pick a random unconnected node
  connected_nodes.add(unconnected_nodes.pop())

  while not empty(unconnected_nodes):
     best_connected_node = None
     best_unconnected_node = None
     shortest_distance = +Infinity

     for node1 in connected_nodes:
       for node2 in unconnected_nodes:
         if distance(node1, node2) < shortest_distance:
           shortest_distance = distance(node1, node2)
           best_unconnected_node = node2
           best_connected_node = node1
     connect(best_connected_node, best_unconnected_node)
     unconnected_nodes.remove(best_unconnected_node)
     connected_nodes(best_unconnected_node)

  return connected_nodes

这假设您拥有的东西本质上是一个完全连接的图形,并且通过&#34;坐标&#34;和#34;没有限制&#34;我认为这就是你所拥有的。如果不是,则需要遍历从连接到未连接节点的顶点集。

答案 1 :(得分:-1)

我认为你可以应用Prim的最短路径算法或Kruskal最短路径算法。这些算法通常提供网络中两个不同节点之间的最短路径。对于您的问题,您可以将每个坐标对表示为顶点,并通过创建边的最小生成树找到它们之间的最短路径。我正在编写下面的伪代码:

mst = queue of all the result edges(or co-ordinates)
p =  queue of all the connected edges
while p is not empty
  edge e = min of p
  if union-find(both vertices of edge e)
    continue
  else
    union-find.add(both vertices of edge e)
    mst.add(e)

最后,您将拥有代表所有坐标之间最短路径的“mst”