简述
Dijkstra算法:由Dijkstra提出的,基于贪心
应用:单源最短路径问题并且权值不为负, 适用于稀疏图
优化前:时间复杂度O(N2) , 空间复杂度O(N)
优化后:时间复杂度O(MlogN) , 空间复杂度O(N) 空间是来存储1点到各个点的距离
算法策略
基于朴素版Dijkstra最短路算法.,将第一步在所有不确定的点中找到离1最短的点进行了优化,利用数据结构堆来优化。
堆优化版Dikstra算法模板
其中,下面的图是用邻接矩阵g来存储,dis[i]表示1点到i点的距离,st[i]表示i点是否已经确定,小顶堆heap存储的pair含义分别是距离和点编号。
int dijkstra(){
//初始化
memset(dis, 0x3f , sizeof dis);
dis[1] = 0;
priority_queue<PAIR,vector<PAIR>,greater<PAIR>> heap;
heap.push({0, 1});
while (heap.size()){
auto t = heap.top();
heap.pop();
int ver = t.second , distance = t.first;
if (st[ver] == true) continue;
st[ver] = true;
//用该点去确定其他点
for (int p = h[ver] ; p != -1 ; p = ne[p]){
int j = e[p];
if (dis[j] > dis[ver] + w[p]){
dis[j] = dis[ver] + w[p];
heap.push({dis[j],j});
}
}
}
//1和n不连通
if (dis[n] == 0x3f3f3f3f) return -1;
return dis[n];
}