`
leonzhx
  • 浏览: 796592 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

 

1. Single-Source Shortest Paths Problem:

    Input: Directed graph G=(V, E). (m=|E|, n=|V| )

              -- each edge has non negative length le

              -- source vertex s

    Output: for each v in V, compute L(v) := length of a shortest s-v path in G

 

2. BFS already compute shortest paths in linear time, if le = 1 for every edge e. If we replace each edge e by directed path of le unit length edges, that will blow up graph too much.

 

3. Dijkstra’s Algorithm :

    Initialize:

        a)  X = {s}  [vertices processed so far]

        b)  A[s] = 0 [computed shortest path distances]

        c)  B[s] = empty path [computed shortest paths for algorithm explanation]

    Main Loop:

        while XǂV:

             a) among all edges (v, w) in E with v in X and w not in X, pick the one that minimizes

                  A[v] + lvw , call it (v* , w*)

             b) add w* to X

             c) set A[w*] := A[v*] + lv*w*

             d) set B[w*] := B[v*] U (v*, w*)

 

4. We cannot reduce computing shortest paths with negative edge lengths to the same problem with non negative lengths by adding large constant to edge lengths. Because paths with more edges will be added more constants which don't preserve shortest paths.

 

5. Correctness Proof :

    Claim: For every directed graph with nonnegative edge lengths, Dijkstra’s algorithm correctly computes all shortestpath distances. Let A[v] be the shortest distance calculated by Dijkstra's algorithm and L[v] be the true shortest distance from s to v.

    Proof by Induction on the number of iterations:

        Base Case: A[s] = L[s] = 0.

        Inductive Hypothesis: all previous iterations are correct (i.e., A[v] = L(v) and B[v] is a true shortest s-v path in G, for all v already in X).

        In current iteration: Pick an edge (v*, w*) and we add w* to X. We set B[w*] = B[v*] u(v*, w*) , A[w*] = A[v*] + lv*w* = L(v*) + lv*w*.  Let P= any s->w* path. It must “cross the frontier” of X and V-X. 

        Let y and z be the vertices on the frontier of the path, while y is in X and z isn't. 

        Length of P = length of s-y + lyz + length of z-w* >= L[y] + lyz >= A[v*] + lv*w*

 

6. Using heap to implement Dijkstra’s Algorithm:

    Two Invariants : 

        a)  elements in heap = vertices of V-X.

        b)  for v in heap , Key[v] = smallest Dijstra greedy score of edge (u, v) in E with u in X

    By invariants, Extract-Min yields correct vertex w* to add to X and A[w*] = Key[w*].

    To maintain Invariant b) :

        When w* extracted from heap, for each edge (w*,v) in E:

           if v in V-X :

              - delete v from heap

              - recompute key[v] = min{key[v] , A[w*] + lw*v }

              - re-Insert v into heap

 

7. Running Time Analysis:

    Heap operations:

    - (n-1) Extract mins

    - each edge (v,w) triggers at most one Delete/Insert combo (if v added to X first)

    So: # of heap operations in O(n+m) = O(m)  (We assume graph is connected.)

    So: running time = O(m log(n))

 

 

分享到:
评论

相关推荐

    Dijkstra's algorithm讨论

    **Dijkstra's算法详解** Dijkstra's算法是图论中的一种著名算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。它能够找到从一个指定起点到图中所有其他顶点的最短路径。在实际...

    DIJKSTRA’S ALGORITHM

    迪杰斯特拉算法是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉(Edsger Wybe Dijkstra)提出的一种用于在图论中解决单源最短路径问题的算法。该算法能够找到一个顶点到其他所有顶点的最短路径,且适用于有向图和无向图,...

    Dijkstra.rar_As One_dijkstra algorithm_simple_dijkstra

    Demonstration of Dijkstra s Minimum Distance Algorithm: DIJKSTRA is a MATLAB program which runs a simple demonstration of Dijkstra s algorithm for determining the minimum distance from one node in a ...

    Geeks : Dijkstra’s Algorithm for Adjacency List Representation 最短路径

    最短路径的O(ElgV)的解法。 使用邻接表存储图,使用堆操作选取下一个最小路径点。...参考:http://www.geeksforgeeks.org/greedy-algorithms-set-7-dijkstras-algorithm-for-adjacency-list-representation/

    Dijkstra’s Algorithm 算法的演示

    迪杰斯特拉(Dijkstra's)算法是一种经典的图论算法,用于寻找加权有向图或无向图中从源节点到所有其他节点的最短路径。这个算法由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出,是贪心算法的一种,它通过逐步...

    matlab开发-DijkstraAlgorithm

    **Dijkstra算法详解** Dijkstra算法,由荷兰计算机科学家艾兹格·迪科斯彻(Edsger W. Dijkstra)提出,是一种用于寻找图中两点间最短路径的算法。在MATLAB环境下,我们可以利用该算法来解决实际问题,如网络路由、...

    Dijkstra Algorithm

    **迪杰斯特拉算法(Dijkstra Algorithm)** 迪杰斯特拉算法是一种用于解决单源最短路径问题的图算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法适用于有向图或无向图,其主要目标是从一个指定的...

    Dijkstra algorithm c++ 实现版 最短路径算法

    根据给定的文件信息,我们可以总结出以下关于 Dijkstra 算法在 C++ 中实现的相关知识点: ### 1. Dijkstra 算法简介 Dijkstra 算法是一种用于寻找图中两点间最短路径的经典算法。该算法由荷兰计算机科学家 Edsger ...

    有向图的最短路径 源代码 Dijkstra's Shortest Path Algorithm 使用min heap

    本代码 利用 Dijkstra's Shortest Path Algorithm 求解有向图的最短路径。 包括 图的构建,求解过程的,排序使用的最小堆 等所有的源代码,并包括测试用例。 是学习最小堆 和 Dijkstra's Shortest Path Algorithm ...

    算法Dijkstra-Algorithm.zip

    dijkstra算法 算法概述: 该算法是一个求最短路径的算法,具体算法的思想为: 找出离源点O最近的点,把该点设为S; 以S点为中转点,查看如果以S点为中转点,计算源点O中转S点到各点的距离transfer_distance; ...

    算法——Dijkstra’s algorithm求最短路径并打印出路径的各个节点

    ### Dijkstra’s Algorithm 修改版:求最短路径的跳数 #### 算法背景与原理 Dijkstra's 算法是一种用于寻找加权图中两点之间最短路径的经典算法。它通常应用于有向图或无向图,并且假设所有边的权重都是非负的。...

    Dijkstra’s Algorithm算最短路径

    迪杰斯特拉(Dijkstra's)算法是一种在加权图中寻找最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法适用于寻找单源最短路径,即从图中的一个特定起点到其他所有节点的最短路径。在...

    dijkstra.zip_between

    Dijkstra s algorithm is an algorithm for finding the shortest paths between nodes in a graph

    Dijkstra-s-algorithm:Dijkstra最短路径算法的Java实现

    ****实施Dijkstra算法在这个简短的项目中,我们实现了Dijkstra的算法。 我们已经获得了GUI的数据和一些代码,该GUI生成了美国城市及其之间不同连接的地图。 我们的目标是为用户计算出他们在地图上选择的任何两个...

    Dijkstra-s_Algorithm

    **迪杰斯特拉算法(Dijkstra's Algorithm)** 迪杰斯特拉算法是由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出的一种单源最短路径算法。这个算法主要用于解决图论中的最短路径问题,尤其适用于加权有向图。它通过...

    dijkstra 很简单:Dijkstra's algorithm to find the shortest path-matlab开发

    迪杰斯特拉算法(Dijkstra's Algorithm)是图论中的一种经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出,主要用于寻找有向图或无向图中从源节点到目标节点的最短路径。在MATLAB中实现Dijkstra算法可以...

    Dijkstra_Algorithm:dijkstra算法的实现,

    **Dijkstra算法**是图论中的一个著名算法,由荷兰...对于这类问题,可以考虑使用Bellman-Ford算法或者Johnson's算法。总的来说,Dijkstra算法在很多实际应用中,如路由选择、网络调度、交通规划等领域都有重要价值。

    Dijkstra-s-algorithm:用Java的Dijkstra-s-算法

    **文件"Dijkstra-s-algorithm-main"**可能包含了完整的Dijkstra算法Java实现代码,包括顶点类、图类、优先队列实现以及主程序。通过分析和运行这个代码,你可以深入理解Dijkstra算法的工作原理,并学习如何在实际...

    Proof for Dijkstra´s Algorithm:Dijkstra算法证明.pdf

    通过这两个引理,我们可以得出结论,Dijkstra算法每次选择的节点`vm`确保了`S`集合的两个属性得以保持,并且逐步逼近找到所有节点的最短路径。随着算法的进行,`S`集合不断增大,直到最终包含所有图中的节点,此时...

    Dijkstra-Algorithm:Dijkstra算法-实现和理论

    对于这种情况,可以使用Bellman-Ford算法或Johnson's algorithm。 - 如果图非常大,Dijkstra算法可能会效率较低。可以考虑使用A*搜索算法,它结合了启发式信息以提高搜索效率。 综上所述,Dijkstra算法是解决最短...

Global site tag (gtag.js) - Google Analytics