【问题标题】:C programming language, shortest pathC编程语言,最短路径
【发布时间】:2012-06-11 18:04:35
【问题描述】:

我正在编写代码来查找两点之间的最短距离。到目前为止,我的代码运行良好。我的意思是它找到了他们应该通过的距离和路径。我需要打印这些信息,但我应该做一个打印功能。它的工作方式是这样的:例如初始点是 4,最终点是 13。

我应该想出一个算法来检查它们的中间点。假设在 4 和 13 之间有一点:7

4--7--13 现在我需要检查它们之间的每一点,例如:

4--6--7--9--13 更具体地说,它将检查 4-6 和 6-7 以及 7-9 和 9-13 之间是否存在点。因此,在下一次迭代中,它可能会形成另一个列表,例如:

4--2--6--7--5--9--17--13 现在假设它们之间不会有任何中间值。这就是我应该打印的。我真的很感激你可以给我的任何帮助和建议

【问题讨论】:

  • 使用递归构建点列表,并在递归返回时打印。不管怎样,这是作业吗?
  • 但是我应该如何使用递归呢?不,这不是功课
  • 您是如何存储积分的?如果您的点适合存储在图形结构中(大多数点系统基本上都属于图形结构),那么解决此问题的最佳方法之一就是使用图形算法。
  • 您使用哪种算法?迪杰斯特拉?
  • 您是否将程序中的点表示(或可以)作为图形数据结构中的节点?使用图可以实现Floyd-Warshall 算法并获得所有图节点之间的最小距离

标签: c algorithm shortest-path


【解决方案1】:

Warshall-Floyd 算法(由 OP 使用)有一个版本能够确定除了图节点之间的距离之外的路径:

Floyd-Warshall algorithm with path-reconstruction

但是,必须注意,这不是解决shortest-path problem 的最佳算法。

【讨论】:

  • Dijkstra 快得多。它也有路径重建,在我看来更容易,因为路径重建是内置在功能中的。 Floyd-Warshall 非常慢,特别是对于大图。检查维基en.wikipedia.org/wiki/Dijkstra%27s_algorithm
  • 就我而言,O(V^3) 是一个糟糕的运行时间。 O(E+V lg V) 好很多。 Floyd Warshall 是一个糟糕的建议,尤其是在需要重建路径时。
  • 是的,你是对的,但我认为实现起来要困难得多
  • @NKamrath 你是绝对正确的。但是OP使用FW,除了距离之外,只需要一种技术来找到路径。无论如何,感谢-1。和平:)
  • 如果你知道你在说什么,我不会否定你的。因为你错了,我不得不这样做。 SSSP 是所要求的,而不是您提供的 ASSP,它为您“帮助”的人提供了一种算法,该算法将运行更长的时间来计算相同的东西,然后要求他付出额外的努力来重建路径而不是迭代图上节点中的一组指针。希望你不要把其他人弄错。
【解决方案2】:

听起来递归是最好的方法。如果它已经可以找到最短路径,我假设您编写了一个函数来查找 2 点之间的最短路径。也许您可以递归分解列表,找到最短路径并将该点附加到列表中。

编辑,抱歉我看错了你的问题,你需要找到中点。将递归函数传递给整个点列表并找到一个中点。如果存在,请将其添加到列表中。如果没有中点,则不要附加任何内容。继续调用这个函数,直到你到达基本情况,这应该是列表中的 1 或 2 个点

【讨论】:

  • 是的,你可能是对的,如果我使用数组来存储元素,我应该如何继续更新它?
  • 我认为您可以在位置 n/2 找到中点。然后将列表分成两部分,从 1 到 n/2 和 n/2 到 n。如果列表有偶数个元素,则将其分成从 1 到 n/2 - 1 和 n/2 + 1 到 n 的 2 个列表,并且不要在列表中附加中点。然后在两个列表上调用递归函数。要更新,您需要将中点放在正确的位置。这可以通过跟踪您在列表中的位置来完成。让我考虑一下
  • 我觉得有点棘手,因为如果我找到一个中点,列表应该移动。其次,下一次迭代将如何工作,我的意思是它会采用旧值还是采用更新后的值?我认为下一次迭代可能会忽略某些值
  • 元素右除 n/2 取结果并制作两个列表。 n = 列表中的 num 个元素。 subList1 = 元素 0 到 n; sublist2 = 元素 n+1 到 n。然后使用相同的函数递归地破坏这些列表。当列表中剩下的元素少于 2 个或更少时,开始将这些元素添加到中间点列表中。您必须确保在第一部分调用递归,然后在第二部分调用递归,以获得正确排序的解决方案。解决方案列表应返回并附加到每个级别,直到递归完成
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多