【问题标题】:Is Dijkstra's algorithm for directed or undirected graphs?Dijkstra 算法是用于有向图还是无向图?
【发布时间】:2016-11-06 12:47:07
【问题描述】:

我一直在尝试用谷歌搜索,但我发现的结果只是增加了我的困惑。似乎两者都可以使用?如果是这样,默认情况下它是为哪一个设计的,需要改变什么才能使其以非默认方式工作(无论是定向的还是非定向的)?

编辑:作为参考,上学期我遇到了一个问题,我得到了这样的列表(机场):

AER,KZN,1.8835
ASF,KZN,1.3005
ASF,MRV,1.1204
CEK,KZN,1.9263
CEK,OVB,1.6733
DME,KZN,1.7892
DME,NBC,2.2319
DME,UUA,2.3786
EGO,KGD,1.4649
EGO,KZN,1.2603
GYD,NBC,2.0755

我被告知它是定向的,并被要求找到最短路径。我把它放到我在 Github 上找到的 Dijkstra 算法中(这是一个开放的计算机期中考试,所以我们几乎没有足够的时间从头开始编写算法),我的教授说它返回的最短路径是不正确的,它是甚至没有可能的路径,因为该列表应该是定向的。我不确定我是否应该修改算法或列表以进行此更正。结果是它返回的第二条最短路径实际上是有向最短路径,但我仍然想知道问题出在哪里。

【问题讨论】:

    标签: algorithm graph dijkstra


    【解决方案1】:

    它可以应用于两者。原因如下:

    无向图与有向图基本相同,在连接节点之间具有双向连接(=两个相反方向的连接) .

    因此,您实际上不需要做任何事情来使其适用于无向图。您只需要知道可以从每个给定节点通过例如到达的所有节点。 邻接列表

    【讨论】:

    • 因此,如果我的列表不包含每个边的重复但反转的条目,它应该给我定向最短路径吗?因为有人告诉我给我的列表是有向的,但是我使用的 Dijkstra 的实现给了我一条无向的最短路径。
    • 嗯,这听起来像是您找到的实现将列表中的条目解释为无向,这不是您想要的,因此您可能应该自己实现算法。我知道的那些通常只使用邻接列表(这是一个列表,其中包含有关您可以从给定节点 => 连接被定向 到达的节点的信息)。这就是为什么我说您不必做任何事情来使其适用于无向图,但是,如果您的算法出于某种原因自动将连接解释为双向,则需要对其进行更改。
    • @Keiwan 这篇帖子stackoverflow.com/questions/22649416/… 说 prims 算法对于有向图将失败。因此,对于帖子中给出的示例,几乎类似于 prims 的 Dijkstras 也会失败。
    • 但是 Dijkstra 和 Prim/Kruskal 计算出两个本质上不同的东西。 Dijkstra 从 一个 节点计算最短路径树,而 Prim/Kruskal 计算 所有 节点之间的最小生成树。没有为有向图定义 MST 的概念 - 连接必须是无向的。对于有向图,您将寻找最低成本的中止,这是使用 Prim/Kruskal 无法完成的。不过,这与 Dijkstra 无关。对于有向图,最短路径树的概念得到了很好的定义,这就是 Dijkstra 也适用于它们的原因。
    • 但是在第二个例子中没有为顶点 s 应用 Dijkstra 给出了错误的答案?
    【解决方案2】:

    您可以在有向图和无向图中使用 Dijkstra 算法,因为当您从邻接列表中有一条要前往的边时,您只需将 edges 节点添加到 PriorityQueue 中。例如,如果我的一个节点具有从 A 到 B 的权重为 3 的边,那么如果它是从 BI 引导的,则无法将边添加回 A,而从 AI 可以将其添加到 B。

    与其他答案一样,请确保不要将其与权重混淆。 Dijkstra 的算法在正加权图上运行,否则优先级队列将毫无用处。

    在您的示例中,Dijkstra 的算法会起作用,因为该图既被加权(正)又具有有向边。

    错误可能是边以无向图的形式被双重分配。将开头的边缘解析为对象时应小心,不要重复邻接列表中的边缘。

    【讨论】:

    • 我不明白这个。为什么要在 Dijkstra 算法的优先级队列中添加边而不是节点?
    • 谢谢,我想了想我说的是node,不是edge。
    【解决方案3】:

    Djikstras 算法通常用于加权图。也许您将它与广度优先搜索 (BFS) 算法混淆了,该算法本质上是用于未加权图的 Djikstras。区别(Djikstras 和 BFS 之间)是当您处理加权路径时,我们现在必须考虑路径成本调整(权重)以及在当前之后访问哪些节点的决策。

    【讨论】:

      【解决方案4】:

      有向图仅仅意味着连接顶点的边能够以一种方式连接,但不能以另一种方式连接。这意味着一个顶点可以与另一个顶点相邻,但另一个顶点可能不与第一个顶点相邻。

      在 Dijkstra 算法的上下文中,图是有向还是无向都无关紧要。 Dijkstra 的算法只是简单地引用一个顶点的相邻顶点。如果要将图从有向图更改为无向图,则必须修改此邻接表。

      【讨论】:

      • 我问是因为我从 Github 上提取了 Dijkstra 的一个实现,以在机场列表中找到最短路径,我的教练说该列表应该是定向的,但它返回的最短路径最终是无向最短路径。那么在这种情况下,我将不得不更改列表而不是算法?
      • 您必须确保机场列表包含方向信息,并且您的算法会记录图表中的方向。找出其中哪个条件(或两者)不满足并相应地进行调整。不过,您自己实现算法可能会更有益,因为这听起来像是用于学术工作。参考是可以的,但要改掉死记硬背的习惯。
      • 因此,例如,它是否应该将AER,KZN,1.8835 视为有向边并且除了双向工作之外还需要KZN,AER,1.8835?因为我不相信我的列表有两个条目,但它仍然将反向订单视为边缘。这正常吗?
      • 在我看来,要求双向图的两个整体并按指示查看一个条目是有道理的。听起来您对 Dijkstra 算法的实现将一个条目视为双向。
      • 好的,谢谢,我想开始明白了。所以在这种情况下,我需要查看算法的实现并删除代码,它还将反向添加到邻接列表中?
      【解决方案5】:

      是的,Dijkstra 适用于有向图和无向图,但所有边权重都应该是 +ve 。因为如果任何权重为 -ve,则可能无法给出正确答案。 它适用于无向图,因为在 Dijkstra 中我们应该总是看到最小边 wt。从它的源顶点

      【讨论】:

        【解决方案6】:

        Dijkstra 可以用于循环图。这意味着它可以用于无向图。因为图中的无向边可以简单地假设为双向边。 A 到 B。B 到 A。Dijkstra 的作品就是为此。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          • 2011-04-19
          • 2013-05-29
          • 1970-01-01
          相关资源
          最近更新 更多