`

Dijkstra算法(单源最短路径)实现

    博客分类:
  • java
阅读更多
http://aloofqq.iteye.com/blog/1002174

Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。

算法描述

  (这里描述的是从节点1开始到各点的dijkstra算法,其中Wa->b表示a->b的边的权值,d(i)即为最短路径值)
  1. 置集合S={2,3,...n}, 数组d(1)=0, d(i)=W1->i(1,i之间存在边) or +无穷大(1.i之间不存在边)
  2. 在S中,令d(j)=min{d(i),i属于S},令S=S-{j},若S为空集则算法结束,否则转3
  3. 对全部i属于S,如果存在边j->i,那么置d(i)=min{d(i), d(j)+Wj->i},转2
  Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
  算法具体步骤 
  (1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。
  (2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
  (3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
  (4)重复步骤(2)和(3)直到所有顶点都包含在S中。
编辑本段
复杂度分析

  Dijkstra 算法的时间复杂度为O(n^2)
  空间复杂度取决于存储方式,邻接矩阵为O(n^2)

想看代码连接上面的网址即可。
分享到:
评论

相关推荐

    贪心算法 Dijkstra 单源最短路径

    用C++实现的贪心算法 Dijkstra 单源最短路径,并包含大量的注释,对理解程序很有帮助

    用Dijkstra算法求图中单源最短路径

    "用Dijkstra算法求图中单源最短路径" Dijkstra算法是一种常用的图搜索算法,用于解决单源最短路径问题。单源最短路径问题是指从一个出发顶点到所有可达顶点的最短路径问题。Dijkstra算法的原理是通过将图中的每个...

    单源最短路径实验报告

    【部分内容】中具体介绍了Dijkstra算法,这是解决单源最短路径问题的经典算法。Dijkstra算法的核心思想是维护一个集合S,集合S中的顶点代表已经找到从源节点到这些顶点最短路径的节点。算法初始时,S仅包含源节点,...

    用Dijkstra算法实现单源最短路径问题

    ### Dijkstra算法实现单源最短路径问题 #### 算法原理 Dijkstra算法是一种用于寻找图中两点之间的最短路径的经典算法。它适用于所有边权重非负的情况,并且可以高效地解决单源最短路径问题。在该问题中,我们需要...

    基于Dijkstra算法的最短路径实现与应用

    该算法主要用于解决单源最短路径问题,即从图中的一个特定起点(源节点)到其他所有节点的最短路径。算法的核心思想是通过不断扩展当前最短路径来逐步构建全局最短路径。 Dijkstra算法的基本步骤如下: 1. 初始化...

    Dijkstra算法寻找最短路径的完整源代码

    "Dijkstra算法寻找最短路径的完整源代码" 本资源提供了Dijkstra算法寻找最短路径的完整源代码,同时附带了Kruskal最小生成树算法。该程序提供了输入输出的完整控制台程序,能够帮助用户快速了解和应用Dijkstra算法...

    基于C++的Dijkstra算法的最短路径问题求解.zip

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,通过应用...

    Dijkstra求单源最短路径

    Dijstra算法用于求解单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。

    Dijkstra算法求最短路径的C/C++程序

    Dijkstra算法是解决单源最短路径问题的有效方法,尤其适用于边权非负的图。通过理解并实现该算法,可以高效地解决诸如网络路由、城市交通规划等实际问题。本程序提供了一个清晰的C/C++实现案例,有助于深入学习...

    基于Dijkstra算法的最短路径问题求解.123

    Dijkstra算法非常适合用于解决非负权重的单源最短路径问题,但在处理负权重边时可能会出现问题。此外,对于非常大的图,Dijkstra算法的时间复杂度较高,可能需要优化算法来提高效率。 综上所述,Dijkstra算法是一种...

    基于贪心法求解单源最短路径问题.docx

    本资源是关于基于贪心法求解单源最短路径问题的实验报告,包括实验内容、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试等部分。 实验目的:理解贪心法的核心思想、贪心法的求解过程,并从算法分析...

    Dijkstra算法求最短路径算法 C++ 经典例题

    综上所述,Dijkstra算法是解决单源最短路径问题的重要工具,尤其适用于C++这样的编程语言。在这个实例中,通过分析城市地图和应用Dijkstra算法,我们可以找到建立医院的最佳位置,以最大程度地满足所有居民的便利性...

    python实现有向图单源最短路径迪杰斯特拉 算法

    迪杰斯特拉(Dijkstra)算法是一种用于寻找有向图中单源最短路径的经典算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。在这个算法中,我们从一个源节点开始,逐步扩展最短路径到其他节点,直到到达所有...

    Dijkstra单源最短路径代码 C/C++实现

    DIJKSTRA单源最短路径算法C/C++实现,内有注释,输入邻接矩阵,输入源点到终点最短路径长度。

    单源最短路径( Dijkstra算法)JAVA实现

    总的来说,Dijkstra算法是解决单源最短路径问题的基石,Java实现使其能够方便地应用于各种实际场景。通过对`Dijkstra.java`文件的理解和学习,你可以深入掌握这一重要算法,并将其运用到自己的项目中。

    单源最短路径 直接copy 运行即可,里面有测试结果

    本篇文章将深入探讨单源最短路径的概念、Dijkstra算法的原理,并通过一个具体的Java实现案例来理解其实际应用。 #### 单源最短路径概念 单源最短路径问题旨在找到一个加权图中从给定源节点到其余所有节点的最短...

    单源最短路径dijkstra模板

    Dijkstra算法是一种常用的图算法,用于解决单源最短路径问题。该算法的基本思想是,通过维护一个距离数组,记录从源节点到其他所有节点的最短距离,并不断更新这些距离,使得它们变得越来越小,直到所有节点的最短...

    单源最短路径(算法 代码)

    本篇文章将深入探讨单源最短路径算法,并通过VC++环境下的C++代码实现来帮助理解。 首先,我们要了解几种常见的单源最短路径算法: 1. **Dijkstra算法**:由荷兰计算机科学家艾兹格·迪科斯彻于1956年提出,适用于...

    Dijkstra算法求最短路径

    Dijkstra算法是一种高效且易于理解的单源最短路径算法,广泛应用于网络路由、地图导航等领域。通过本节的介绍与分析,我们不仅了解了算法的基本原理,还深入探讨了其实现细节,这有助于我们更好地理解和应用这一经典...

    单源最短路径vc源码(贪心算法)

    总的来说,这个源代码提供了贪心算法解决单源最短路径问题的一个实例,对于理解Dijkstra算法及其在C++中的实现具有参考价值。通过分析和运行这段代码,学习者可以深入理解贪心算法的运作机制,并进一步掌握图论和...

Global site tag (gtag.js) - Google Analytics