Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。Dijkstra算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
问题:有N个节点,M条边,求某节点到另一节点的最短距离 输入:先输入N(从0开始)代表N个节点,M条边,随后跟随N行,p1p2d,最后输入起始点st和终点ed 输出:求最短距离 例:
算法描述:
① 初始化,将图edge数组以及距离数组dis所有值置为极大量,表示不可访问,标记数组置为false
算法最多需要更新N个点才能得到最短路径,每次遍历节点也需要查询N遍其他节点与该节点的关系,所以空间复杂度应该是O(n^2);我们使用了N*N邻接表储存边,所以空间复杂度是O(n^2)
邻接矩阵实现简单,但是浪费很多空间,在稀疏图中就更加严重了。我们可以使用邻接表来进行优化,邻接表是图中常用的存储结构之一,采用链表来存储,每个顶点都有一个链表,链表的数据表示和当前顶点直接相邻的顶点的数据,即顶点 和边权。 它的优点是:对于稀疏图不会有数据浪费;缺点就是实现相对邻接矩阵来说较麻烦,需要自己实现链表,动态分配内存。 C++可以使用vector代替实现功能
在搜索尚未访问过的离起点最近的点时,需要遍历N个节点。所以如果使用排序算法快速获取距离最近的点,就可以降低整个算法时间复杂度,比如使用堆就可以快速得到最小值。STL中可以使用优先队列priority_queue,它的底层用堆实现,这样总的时间复杂度可以降到O(nlog2n)