关于Dijkstra在维基百科上的算法实现的问题

时间:2011-02-09 06:44:55

标签: algorithm dijkstra

function Dijkstra(Graph, source):
    for each vertex v in Graph:            // Initializations
        dist[v] := infinity ;              // Unknown distance function from source to v
        previous[v] := undefined ;         // Previous node in optimal path from source
    end for ;
    dist[source] := 0 ;                    // Distance from source to source
    Q := the set of all nodes in Graph ;
    // All nodes in the graph are unoptimized - thus are in Q
    while Q is not empty:                  // The main loop
        u := vertex in Q with smallest dist[] ;
        if dist[u] = infinity:
            break ;                        // all remaining vertices are inaccessible from source
        fi ;
        remove u from Q ;
        for each neighbor v of u:          // where v has not yet been removed from Q.
            alt := dist[u] + dist_between(u, v) ;
            if alt < dist[v]:              // Relax (u,v,a)
                dist[v] := alt ;
                previous[v] := u ;
            fi ;
        end for ;
    end while ;
    return dist[] ;
end Dijkstra.

上述算法已在维基百科中提到Dijkstra最短路径。我在这里无法理解的是,虽然我们将所有顶点的距离设置为无穷大[第3行],但在第9行我们分配u := vertex in Q with smallest dist[],但因为所有距离都是无限的(如设置的那样)在第3行),如何有一个最小的距离?

3 个答案:

答案 0 :(得分:2)

在第6行,它说dist[source] := 0使得其中一个距离不是无限的。删除后,循环的连续迭代设置dist[v] := alt,创建更多的非无限距离。

答案 1 :(得分:1)

在第6行中,到起始节点的距离设置为零。一切都从那里开始。

答案 2 :(得分:0)

Dijkstra算法背后的想法是,最初,您不知道图中任何节点的距离,因此您将它们全部设置为无穷大。然而,随着算法的进行,它从节点的起始节点向外生长一种“球”,其中存在距离的估计。最初,您将起始节点与其自身的估计距离设置为0,因为在完全没有距离之后,它可以从自身轻松到达。这就是为什么算法定义良好的原因 - 最初,你有一些你知道距离的节点,每当你访问一个节点并展开它时,你通过考虑边缘的影响来减少到该节点所有邻居的距离离开那个节点。

有趣的是,有一种情况是可能最终导致某些距离无穷大。值得注意的是,如果某个节点v无法从起始节点到达,那么它的距离永远不会减少,Dijkstra的算法将在远离源节点的距离无限远处报告。

另一个重要的细节是,如果距离达到平局,你可以任意打破这种关系。在这种情况下,Dijkstra的算法运行得很好。如果你真的反对这个想法,你可以通过在所有边缘成本中加入一个非常小的数字来人为地打破所有关系。