堆优化的迪杰斯特拉
迪杰斯特拉算法
rep(i, 1 , n-1){
int minx = inf;//对于每一次找点,都要找当前最短路的点
int pos;//记录一下是哪个点
//**********优化点A*************
rep(j , 1 , n){
if(!vis[j] && dis[j] < minx){
minx = dis[j];
pos = j;
}
}
//pos顶点加入S集合
vis[pos] = 1;
//************优化点B*****************
//由于pos顶点的进入 对S集合以外的结点 其距离因为pos的加入需要进行更新
rep(k, 1 , n){
if(!vis[k] && dis[k] > dis[pos] + G[pos][k]){
dis[k] = dis[pos] + G[pos][k];
}
}
}
- 优化之处
- 优化点B :很容易想到,不必扫描1~n,只需遍历由pos顶点可以到达的顶点即可,可以使用vector存储图,或者使用链式前向星
- 优化点A :事实上,每次找出一个距离源点最短的顶点,需要扫描1~n吗?一个很朴素的想法是如果把这些点存起来然后按照距离关键字二分查找呢?
- 这里可以使用一个【优先队列】,内部实现为小根堆,满足动态的插入,在O(1)的时间内直接取出最小点,结合优化点A,使得总时间复杂度从O(V^2)降到O(VlogV+VE),对稀疏图很有效果。
#include
#include
#include
#include
#include
#include
#include
#include