图论中四个最短路径算法

(一)单源最短路径算法

1. Dijksta算法

要求图G(V,E)的所有边的权重都为非负值。

运用了贪心算法的思想,但是较好地的是,其找到的解一定是最优解。

算法主要思想:

用数组d[]表示开始节点A到其余节点的路径长度;用w(u,v)表示节点u到v的权值,若两节点无直接路径,则该值为无穷大;矩阵Q保存每次循环每个节点的dv]值,总结点数为n。

初始时,开始节点到自身距离d[A]初值为0,到其余节点d[V]初值为无穷大。

循环:对每个节点进行判断,若d[v]大于d[u]+w(u,v),则令d[v]=d[u]+w(u,v),即进行一次松弛操作。一次操作后,选取本次循环中d[i]最小的节点i为下次循环的节点u,这也是贪心的思想所在,即每次循环选取路径最短的节点为中间节点。

上述进行循环n-1次。

则d[v]为从初始节点到节点v的最短路径。

时间复杂度:O(V.Texteact-min+E.Tdecrease-key)。

2. Bellman-Ford算法

图G(V,E)中的边的权重可以为负值。

思想:

在上述Dijkstra算法的思想上,增加了一个判断是否有负环路的操作,如果有负环路,则表示该图中不存在从初始节点到目标节点的最短路径。

判断是否存在负环路:松弛操作进行完后,判断若d[v]>d[u]+w(u,v),则表示有负环路,报告错误。

时间复杂度:O(VE)。

(二)全源最短路径算法

3. Floyd-Warshall算法

要求图G(V,E)的所有边的权重都为非负值。

思想:

用Ck(i,j)表示第k次循环后的矩阵C(i,j),k从1到n。

该算法的框架为三层循环,最外层为循环次数,即一共生成n个矩阵C(,),里面两层循环即n=k时对C(,)进行遍历填写。

C(i,j)表的填写为松弛操作:若C(i,j)>C(i,k)+C(k,j),则C(i,j)=C(i,k)+C(k,j)。

时间复杂度:O(n^3)。

4. Johnson算法

图G(V,E)中的边的权重可以为负值。

思想:

对权重重新赋值,使其新的权重不小于0,且保持各该图的最小路径关系,再利用Bellman-ford算法进行计算。

时间复杂度:O(VE+V^2LGV)。

匆忙写的,难免有错误的地方,要是发现了欢迎指正。

原文地址:https://www.cnblogs.com/yuyu-blog/p/9022163.html

时间: 2024-10-06 14:39:01

图论中四个最短路径算法的相关文章

【141029】VC游戏编写中的求解最短路径算法源码

VC游戏编写中的求解最短路径算法源码,本示例是自动寻径演示,篮点是起点,红点是终点,按确定键开始.源码爱好者注:编译后运行的时候请把EXE文件从Debug目录中拷贝到项目根目录中,若不然会出错. 编著.程序设计:唐明理 程序顺序: 初始化队列.待处理节点入队列, 依靠对目的地估价距离插入排序,将离目的地估计最近的方案出队列,释放栈顶节点,释放申请过的所有节点,估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小, 尝试下一步移动到 x,y 可行否,如果曾经有更好的方案移动到 (x,y

图论(二):图的四种最短路径算法

本文总结了图的几种最短路径算法的实现:深度或广度优先搜索算法,弗洛伊德算法,迪杰斯特拉算法,Bellman-Ford算法 1),深度或广度优先搜索算法(解决单源最短路径)从起始结点开始访问所有的深度遍历路径或广度优先路径,则到达终点结点的路径有多条,取其中路径权值最短的一条则为最短路径. 下面是核心代码: void dfs(int cur, int dst){ /***operation***/ /***operation***/ if(minPath < dst) return;//当前走过路

初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现

这一次,笔者使用了STL库中的优先级队列(Priority Queue)来完成Dijkstra算法中extract-min()语句(即从未选中的节点中选取一个距离原点s最小的点)的功能.由于优先级队列的插入.删除操作只需要logn的时间花费,因此降低了不少运行时间. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(Ml

初学图论-Dijkstra单源最短路径算法

当图中所有边的权重为非负值时,我们可以选用巧妙Dijkstra算法. 本文使用C++实现了这一基本算法.参考<算法导论>第24.3节. 不过在算法的实现中,取当前与原点s最近的节点操作时,采用了线性扫描的策略.如果换用堆或者优先级队列会好很多. /**  * Dijkstra's Single Source Shortest Path Algorithm in C++  * Time Cost : O(N^2)  * Thanks to Introduction to Algorithms (

javascript实现有向无环图中任意两点最短路径的dijistra算法

有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijk

图论之最短路径算法

简介: 求最短路径算法中最具代表性的是Dijkstra算法. Dijkstra算法的思想是基于贪心策略的. 概述其过程是通过设置顶点集合S并不断地做贪心选择来扩充集合. 贪心选择的标准是每次都选择从源节点到该节点的路径长度最短. 难点: 网络上博客中大多数人写的最短路径算法大多都是只能寻找到最短的一条路径. 但是很多时候可能存在并列最短的路径,需要找出所有同时最短的路径. 在这里我给大家分享一个时间复杂度大概是O(n2)的算法,求并列最短路径算法. 求出一条最短路径的算法步骤如下: 假设G={V

算法7-6:图论中的难题

二部图 难度:★★ 二分图是图论中的一种特殊模型,指顶点可以分成两个不相交的集使得在同一个集内的顶点不相邻(没有共同边)的图. 下图是一个二分图的例子,红点之间不会相邻,白点之间不会相邻. 判断图中是否存在环 难度:★★ 通过深搜就可以解决了. 欧拉环 难度:★★ 从一个顶点出发,所有的边都只经过一次,最后回到起点.判断一张图中是否存在这样的路径. 哈密尔顿环 难度:★★★★ 从一个顶点出发,所有的顶点都经过一次,最后回到起点.判断一张图中是否存在这样的路径. 这个是一个经典的NP完全问题,目前

图论(三) (一)最短路径算法 2.Dijkstra算法

Dijkstra 算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值.该算法的时间复杂度是O(N2),相比于处理无负权的图时,比Bellmad-Ford算法效率更高. 算法描述: 首先引用<算法导论>中的一段比较官方的话,如果可以看懂,那下一部分就可以跳过了: "Dijkstra算法在运行过程中维持的关键信息是一组结点集合S.从源结点s到该集合中每个结点之间的最短路径已经被找到.算法重复从结点集 V - S 中算则最短路径估计的最小的结点 u ,将 u 加

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复