最短路径的部分算法实现和复杂度

参考:

各种最短路算法时间分析参考:http://blog.csdn.net/zxy_snow/article/details/6270468

带权最短路算法分析:https://www.renfei.org/blog/weighted-shortest-path.html

本题题意:算出起点到所有点的最短路总距离,注意本题有重边

例如:1 3 5

     1 3 2

那么只能取最短的边

本题代码图的储存方式皆使用静态邻接表,n代表点数,m代表边数:

...

本题中所有算法都有一个dis[n]的数组,下标表示点的编号,数组表示起点到其他每个点的距离

1.Bellman-Ford

时间复杂度:O(VE),效率一般
适用范围:(很广)允许存在负权边,能够判断图中是否存在从源点可到达的负权环路

主要思想是使用n-1次循环,每次循环将m条边遍历,若可以通过这条边(假设为u到v)

将源点到v的距离,缩短到源点到u再通过这条边到v的距离,更新dis[v]。

核心代码:(本题没使用静态邻接表只用了结构数组记录边的信息)

....

代码用时:155ms

2. SPFABellman-Ford 队列优化)

图解:http://blog.csdn.net/qq_25605637/article/details/50858414

时间复杂度:最坏也是O(kE),k为一较小常量。效率很高
适用范围:(较广),允许存在负权边,但不允许负权环路
代码复杂程度:较易,需队列

主要思想是使用队列去掉bellman的一些不必要判断,采用了一个vis数组标记进入队列的元素。如果这条边(u到v)可以更新dis值,而且v没被标记,将v加入队列,标记v。但本题可能由于代码使用数据结构的不同并没有达到优化效果

核心代码:

代码用时:166ms

3.Dijkstra

适用范围:(一般)不允许存在负权边适用范围:(一般)不允许存在负权边
这个算法复杂度取决于"取最小"(Extract-min)操作使用的算法
Extract-min操作                时间复杂度               代码复杂程度
顺序检测所有点决定最小值           O(V^2)                        一般

主要思想 采用n次循环将边进行松弛,每次循环选择dis数组中距离最短的并且未被标记的点松弛,然后对以这点为起点的所有边松弛dis数组,标记该点。

4. Dijkstra(优先队列优化)

适用范围:(一般)不允许存在负权边
这个算法复杂度取决于"取最小"(Extract-min)操作使用的算法

使用Binary-Heap(优先队列)       O((V+E)lgV)                 较复杂

主要思想是使用优先队列优化每次寻找最短边的操作,其实就是把查找的复杂度降到Ologn?,因为优先队列的数据结构是堆。

需要构建一个结构作为队列元素和重载一个比较函数,还需要运用初始化列表,这部分写法比较难理解,暂且当做模板使用。

队列元素:

代码用时:159ms

时间: 2024-10-12 22:30:57

最短路径的部分算法实现和复杂度的相关文章

最短路径之Dijkstra算法

Dijkstra算法: 首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的的长度:如D[3]=2表示从始点v到终点3的路径相对最小长度为2.这里强调相对就是说在算法过程中D的值是在不断逼近最终结果但在过程中不一定就等于长度.它的初始状态为:若从v到vi有弧,则D为弧上的权值:否则置D为∞.显然,长度为 D[j]=Min{D | vi∈V} 的路径就是从v出发的长度最短的一条.此路径为(v,vj). 那么,下一条长度次短的是哪一条呢?假设该次短路径的终点是vk,

图的单源最短路径:Dijkstra算法实现

本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法. 算法核心思想参见维基.简而言之,设集合S存放已经求出了最短路径的点.初始状态S中只有一个点v0,之后每求得v0到vn的最短路径,就会更新v0到所有vn邻接的点的一致的最短路径(不一定是最终的最短路径),如此重复,每次会确定v0到一个点的最短路径,确定好的点加入S中,直至所有点进入S结束.在本文中

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

做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi...Vk)也必定是从i到k的最短路径.Dijkstra是以最短路径长度递增,逐次生成最短路径的算法.例如:对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+cost[i][j]}.假设G

排序算法的时空复杂度、稳定性分析

1.基本概念 2.时空复杂度 3.稳定性 4.使用情况分析 排序算法总结(C语言版)已介绍排序算法的基本思想和C语言实现,本文只介绍时空复杂度和稳定性. 1.基本概念 时间复杂度: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法的语句执行次数称为语句频度或时间频度.记为T(n).n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化.但有时我们想知道它变化时呈现什么规律,为此,引入时间复杂度概念.若有某个辅助函数f(n),使得当n趋近

hdu 2680 最短路径(dijkstra算法+多源最短路径单源化求最小值)

Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7062    Accepted Submission(s): 2301 Problem Description One day , Kiki wants to visit one of her friends. As she is liable

HDU1535——Invitation Cards(最短路径:SPAF算法)

Invitation Cards DescriptionIn the age of television, not many people attend theater performances. Antique Comedians of Malidinesia are aware of this fact. They want to propagate theater and, most of all, Antique Comedies. They have printed invitatio

详解算法的各种复杂度的差别有多大(带图)

做算法分析的时候经常用到各种时间复杂度如O(n), O(logn), O(nlogn), O(n^2), ... 它们之间到底有多大的差别呢?下面这张图是一个直观的表达: 可见,各个常用的时间复杂度之间都存在着巨大的差异.从O(nlogn)到O(n),从O(n)到O(logn),都是性能上的巨大飞跃. 从另一个角度而言,大于O(n^2)或O(n^3)时间复杂度的程序实际上都是不可用的.根据维基百科,现在最强的CPU每秒大概可执行428亿条指令(4*10^10),而对于一个O(2^n)的程序,当n

HDU1548——A strange lift(最短路径:dijskstra算法)

A strange lift DescriptionThere is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "U

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 之前已经对Dijkstra算法做了介绍(不懂的可以看这篇博客:Dijkstra算法详解),所以这篇博客打算对Floyd算法做