`
huoyj
  • 浏览: 89392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

迪杰斯特拉算法

阅读更多
定义
  Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
问题描述
  在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)
迪杰斯特拉(Dijkstra)算法思想  
按路径长度递增次序产生最短路径算法:
  把V分成两组:
  (1)S:已求出最短路径的顶点的集合
  (2)V-S=T:尚未确定最短路径的顶点集合
  将T中顶点按最短路径递增的次序加入到S中,
  保证:(1)从源点V0到S中各顶点的最短路径长度都不大于
  从V0到T中任何顶点的最短路径长度
  (2)每个顶点对应一个距离值
  S中顶点:从V0到此顶点的最短路径长度
  T中顶点:从V0到此顶点的只包括S中顶点作中间
  顶点的最短路径长度
  依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的
  直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
  (反证法可证)
  求最短路径步骤
  算法步骤如下:
  1. 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值
  若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
  若不存在<V0,Vi>,d(V0,Vi)为∝
  2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
  3. 对其余T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的
  距离值缩短,则修改此距离值
  重复上述步骤2、3,直到S中包含所有顶点,即W=Vi为止

迪杰斯特拉算法的原理
首先,引进一个辅助向量D,它的每个分量D表示当前所找到的从始点v到每个终点vi的最短路径的长度。如D[3]=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从v到vi有弧,则D为弧上的权值;否则置D为∞。显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条最短路径。此路径为(v,vj)。 那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。 一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是D[j]=Min{D | vi∈V-S} 其中,D或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。 迪杰斯特拉算法描述如下: 1)arcs表示弧上的权值。若不存在,则置arcs为∞(在本程序中为MAXCOST)。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D=arcs[Locate Vex(G,v),i] vi∈V 2)选择vj,使得D[j]=Min{D | vi∈V-S} 3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。
分享到:
评论

相关推荐

    最短路问题迪杰斯特拉算法PPT课件.pptx

    "迪杰斯特拉算法PPT课件" 迪杰斯特拉算法是解决最短路问题的一种常用方法。该算法以埃德斯格·迪杰斯特拉命名,是一种常用的图算法,用于计算从图中的某个节点到其他所有节点的最短路径。 问题的提法及应用背景: ...

    迪杰斯特拉算法代码实现

    实现迪杰斯特拉算法 Dijkstra void main() { //设置初值 int u=1; //设源点的序号为1 for(int i=0; i; i++) { Visited[i]=0; path[i]=u-1; Distance[i]=Graph[u-1][i]; } Visited[u-1]=1; //源点已...

    关键路径实现,迪杰斯特拉算法,弗洛伊德算法

    本篇文章将深入探讨这些主题,特别是关键路径的实现、迪杰斯特拉算法和弗洛伊德算法。 首先,关键路径(Critical Path Method, CPM)是一种项目管理技术,用于确定项目中最长的依赖路径,这条路径决定了项目的最短...

    数据库课程设计《火车出行路线规划及售票系统》迪杰斯特拉算法实现

    首先,迪杰斯特拉算法是一种著名的图论算法,由荷兰计算机科学家艾兹格·迪杰斯特拉提出。它的主要目标是在加权有向或无向图中寻找从源节点到其余所有节点的最短路径。在火车出行路线规划中,每个城市可以被视为图中...

    我的迪杰斯特拉算法小结

    需要注意的是,迪杰斯特拉算法只能处理没有负权边的图,如果有负权边,可能会导致算法得到错误的结果,因为负权边可能导致更短的路径在算法执行后期才被发现。对于存在负权边的图,可以使用其他算法,如Bellman-Ford...

    数据结构迪杰斯特拉算法程序

    迪杰斯特拉算法的基本思想是使用贪心策略,每次选取当前未访问节点中距离源节点最近的一个进行访问,并更新其相邻节点的距离。算法的核心在于维护一个优先队列(通常用最小堆实现),存储待处理的节点并根据它们到源...

    迪杰斯特拉算法程序C语言实现

    在C语言中实现迪杰斯特拉算法,需要理解以下几个关键知识点: 1. **图的概念**:在图论中,图是由顶点(节点)和边组成的集合。顶点代表实体,边代表顶点之间的关系或连接。 2. **有向图与无向图**:在迪杰斯特拉...

    迪杰斯特拉算法的动态实现

    迪杰斯特拉算法(Dijkstra's Algorithm)是图论中的一种著名算法,由荷兰计算机科学家艾兹格·迪杰斯特拉在1956年提出。这个算法主要用于寻找图中两个节点之间的最短路径,特别是在加权无环图(加权意味着边有权值,...

    使用标准模板库写迪杰斯特拉算法

    在给定的“使用标准模板库写迪杰斯特拉算法”中,我们重点关注两个关键点:邻接矩阵的实现以及模板库中的优先队列。 1. 邻接矩阵:邻接矩阵是一种表示图结构的数据结构,它使用二维数组来存储图中节点之间的边和...

    数据结构课设之校园导航系统(迪杰斯特拉算法)

    在本项目中,"数据结构课设之校园导航系统(迪杰斯特拉算法)"是一个典型的计算机科学问题,它涉及到图论和数据结构的核心概念,尤其是迪杰斯特拉(Dijkstra)算法。迪杰斯特拉算法是一种用于寻找图中两个节点之间...

    迪杰斯特拉算法matlab源码

    用MATLAB实现迪杰斯特拉算法来寻找最短路径,压缩包中DIJ为算法的执行程序,SymMatrix为将邻接矩阵补齐为对称矩阵的程序,两个graph文件存储的两个邻接矩阵,DIJ加载了其中一个进行计算。也可以自己重新编辑邻接矩阵...

    7S迪杰斯特拉算法

    7S迪杰斯特拉算法可能指的是在特定的7个步骤或者与7个子任务相关的迪杰斯特拉算法实现。这可能涉及到对特定问题的优化或者是在特定环境下应用迪杰斯特拉算法。压缩包中的文件可能包含了实现这些步骤的代码示例、解释...

    迪杰斯特拉算法的Java实现

    在Java中实现迪杰斯特拉算法,通常涉及以下几个关键步骤: 1. **数据结构**:首先,我们需要定义数据结构来表示图中的节点和边。`Vertex`类可以用来表示图中的节点,包含节点的标识和距离信息。此外,我们还需要一...

    图的邻接矩阵实现 floyd算法 迪杰斯特拉算法

    综上所述,本文提供的代码片段展示了如何使用邻接矩阵来表示图,并且涉及到了几种重要的图算法,包括 Floyd 算法、迪杰斯特拉算法、广度优先搜索、深度优先搜索以及最小生成树等。这些算法是图论研究中的基础,广泛...

    算法导论_贝尔曼福特 和 迪杰斯特拉 算法的实现

    你可以通过读取文件,构建图结构,然后分别运行贝尔曼-福特和迪杰斯特拉算法,比较它们的输出结果是否一致(对于没有负权边的图),以及是否符合预期的最短路径。 总的来说,了解并熟练掌握这两种算法是算法学习的...

    迪杰斯特拉算法C语言实现

    迪杰斯特拉算法算法步骤: (1)初始时,S只包含源点。 (2)从U中选取一个距离v最小的顶点k加入S中(该选定的距离就是v到k的最短路径长度)。 (3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到...

    迪杰斯特拉算法景点问题C语言

    在C语言中实现迪杰斯特拉算法,首先需要理解其基本步骤: 1. 初始化:创建一个图的数据结构,通常可以使用邻接矩阵或邻接表来表示。设置源节点的距离为0,其余所有节点的距离为无穷大。创建一个优先队列(如最小堆...

    用C语言写的迪杰斯特拉算法,

    ### 使用C语言实现的迪杰斯特拉算法:深入解析与应用 #### 知识点一:迪杰斯特拉算法概述 迪杰斯特拉算法(Dijkstra's Algorithm)是由荷兰计算机科学家艾兹赫尔·迪杰斯特拉于1956年提出的一种用于寻找图中两点间...

    迪杰斯特拉算法(Dijkstra)

    数据结构与算法中图求最短路径,迪杰斯特拉算法的实现,带详细注释,可完整实现。

    Python实现迪杰斯特拉算法并生成最短路径的示例代码

    def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print(Start Dijstra Path……) path=[]#s-d的最短路径 n=len(network)#邻接矩阵维度,即节点个数 fmax=999 w=[[0 for i in ...

Global site tag (gtag.js) - Google Analytics