我一直试图谷歌这一点,但我发现的结果只会增加我的困惑。它似乎可以用于两者?如果是这样,它是默认设计的,需要改变什么才能使其以非默认方式工作(无论是定向还是非定向)?
编辑:作为参考,上个学期我遇到了一个问题,我给了这样一个列表(机场):
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算法中(这是一个开放计算机中期,所以我们没有足够的时间从头开始编写算法)而我的教授说它返回的最短路径是不正确的,它甚至不是一个可能的路径,因为该列表应该是定向的。我不确定我是否应该修改算法或列表以进行此更正。结果是它返回的第二条最短路径实际上是定向最短路径,但我仍然想知道问题是什么。
答案 0 :(得分:23)
它可以应用于两者。原因如下:
无向图表与连接节点之间双向连接(=相反方向的两个连接)的定向图基本相同。
所以你真的不需要做任何事情来使它适用于无向图。您只需知道从每个给定节点到达的所有节点,例如: 邻接列表。
答案 1 :(得分:5)
您可以在有向图和无向图中使用Dijkstra算法,因为当您有从边缘列表前往的边时,只需将边添加到PriorityQueue中。例如,如果我的一个节点有一个从A到B的权重3的边缘,那么如果从BI指向它将无法将边缘添加回A,而从AI可以将其添加到B.
与其他答案一样,请确保不要将其与重量混淆。 Dijkstra的算法在正加权图上运行,否则优先级队列将无用。
在你的例子中,Dijkstra的算法会起作用,因为图形既有权重(正面)又具有有向边缘。
错误可能是边缘已经以无向图的形式进行了双重分配。将开头边缘解析为对象时要小心,不要复制邻接列表中的边缘。
答案 2 :(得分:4)
Djikstras算法通常用于正加权图。也许你将它与广度优先搜索(BFS)算法混淆,后者本质上是未加权图的Djikstras。差异(Djikstras和BFS之间),就是当你处理加权路径时,我们现在必须考虑路径成本调整(权重)和关于当前节点之后要访问的节点的决定。
答案 3 :(得分:3)
指向的图形只意味着连接顶点的边可以单向连接,而不能连接另一个。这意味着一个顶点可以与另一个顶点相邻,但其他顶点可能与第一个顶点不相邻。
在Dijkstra算法的背景下,图表是有向还是无向无关紧要。 Dijkstra算法简单地引用顶点的相邻顶点。如果您要将图表从定向更改为无定向,则必须修改此邻接列表。
答案 4 :(得分:0)
是的,Dijkstra既适用于有向图又适用于无向图,但是所有边缘权重都应该为+ ve。因为如果任何权重为-ve,则可能无法给出正确的答案。 它适用于无向图,因为在Dijkstra中,我们应始终看到最小边线宽。从其源顶点开始
答案 5 :(得分:0)
Dijkstra 可以用于循环图。这意味着它可以用于无向图。因为图中的无向边可以简单地假设为双向边。 A to B. And B to A. Dijkstra 的作品。