最短路的三种算法(Floyd、Dijkstra、SPFA)

您所在的位置:网站首页 用dijkstra算法求下图的最短路 最短路的三种算法(Floyd、Dijkstra、SPFA)

最短路的三种算法(Floyd、Dijkstra、SPFA)

2023-12-19 01:19| 来源: 网络整理| 查看: 265

前言

乍一看搜索跟这个一样都可以找出一个点到另一个点的最短距离,但是有些问题两者都可以解决,而另一些搜索就不能解决了,搜索有确定的方向一步一步走,而最短路是告诉你某两个点直接可以直接走,没有确定的方向。最短路问题,通俗的说就是就是给你n个点,m条边,然后找出某两个点之间的最短距离。解决最短路常用的有三种算法Floyd、Dijkstra、SPFA。三种方法各有优劣

Floyd算法是多源最短路算法,复杂度最高(n^3),通常用在点比较少的起点不固定的问题中。能解决负边(负权)但不能解决负环。Dijkstra算法是单源最短路算法,最常用时间复杂度(n^2)优化后可以达到(nlogn),不能解决负边问题,稀疏图(点的范围很大但是边不多,边的条数|E|远小于|V|²)需要耗费比较多的空间。SPFA算法适合稀疏图,可以解决带有负权边,负环的问题,但是在稠密图中效率比Dijkstra要低。 三种方法各有优劣适合的情况不同,所以可以判断情况选择一个适合的算法也是ACMer的基本素质。 引用一段比较正规的定义:

在一个无权的图中,若从一个顶点到另一个顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一个顶点到另一个顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径叫作最短路径或者最短距离。 对于带权的图,考虑路径上各边的权值,则通常把一条路径上所经边的权值之和定义为该路径的路径长度或带权路径长度。从源点到终点可能不止一条路径,把带权路径长度最短的那条路径称为最短路径,其路径长度(权值之和)称为最短路径长度或最短距离。

Floyd算法

Floyd算法比较简单,就是暴力枚举了所有的可能,将所有可能找遍就知道了两点之间的最短路

参数解释

Chara数组 :储存两点间的距离,Chara[i][j]的值就是点i到点j的距离。 n:总共有n个点。 p[i][j]:代表对应顶点的最小路径的前驱矩阵 MAX:定义最大值,路不通的情况距离就是MAX

算法思想

很容易理解,我们从一个点i到另一个点j,无非就两种走法

直接从i到j通过中间点k中转,i->k->j 所以我们就遍历所有情况,如果通过某个中转点距离小于直接到达的距离,就更新这两点间的距离。

if(Chara[i][j] > Chara[i][k] + Chara[k][j]) Chara[i][j] = Chara[i][k] + Chara[k][j];

代码 #define MAX 65535 int Chara[N][N],p[N][N]; int n,m; void Floyd() { for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3