前言
上一期我们水了一篇写了一篇邻接矩阵算法
但还没有真正碰到实际问题
如果只是单点查询或者查询是否相连
可以使用并查集来解决
那如果是求边权值方面
也就是最短路呢?
当然并查集也可以做
但很烦
时间复杂度也可能很高
那怎么办呢?
dijkstra
d i j k s t r a dijkstra dijkstra 是一种求最短路径的常用算法
用于解决有向图(无向图会炸掉)
以前也有一些算法能够解决问题
但他们的时间复杂度趋于暴力解决
大多都是 O ( n 3 ) O(n^3) O(n3) 或 O ( n 2 ) O(n^2) O(n2) 之类的
如果碰到 n < = 1 0 5 n<=10^5 n<=105 这种毒瘤数据无法通过
而为了通过该类题目
我们可以进行时间复杂度上的优化
从 O ( n 2 ) O(n^2) O(n2) 优化为 O ( n l o g n ) O(nlogn) O(nlogn) 级别
这就是 d i j k s t r a dijkstra dijkstra 算法啦
原理
以前学搜索的时候
学过广度优先算法
而广度优先算法可以便捷的查询边
并且时间复杂度也不是很高
(在进行剪枝,优化的情况下)
我们可以用一个 v i s [ i ] vis[i] vis[i] 数组存储已经访问过的节点
用数组 d i s [ i ] dis[i] dis[i] 存储未访问过的节点
这样可以实现广搜啦
那我们要如何查询最短路径呢?
按正常思路,要先把数组排一遍序
但问题是
广度优先是使用队列进行搜索的
队列怎么排序啊????