在OI比赛中有许多图论问题,求最短路径就是一类。最短路径有许多的求法,比如回溯、Floyd算法(弗洛伊德算法)、bellman算法、SPFA算法和Dijkstra(迪杰斯特拉算法)等
因为回溯与其他算法时间复杂度高得多,所以我们在除了不会写只能暴力的情况下是不考虑通过回溯来求最短路。Floyd算法可以计算负权值,而且时间复杂度要比Dijkstra算法快那么一丢丢(几乎可以忽略不计),所以Floyd算法在学习最短路等问题的时候因该是“必修课”之一。bellman算法时间复杂度不是很高,也可以计算负权值,但算法难实现,不适合刚开始学最短路的选手。SPFA算法是通过优先队列优化bellman算法,所以…^ - ^;
Dijkstra算法是OI选手求最短路问题最常用的算法,它在所有求最短路的算法中跑的不是最快的,也不能求负权值……(有没有一丝很鸡肋的感觉?)
下面进入正题
Dijkstra算法是典型的算法。Dijkstra算法是很有代表性的算法。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的方式,这里均采用永久和临时标号的方式。注意该算法要求图中不存在负权边。
基本信息
注:Dijkstra又被成为单源最短路径算法,因为它只能求从一点到其他点的最短路
理论:
每一次从这一个点(n)出发,找到一个n到它距离最近且并未访问过的点ÿ