/**
* 最短路径
* Dijkstra算法
* 首先根据起始顶点到当前顶点的dist 构建小顶堆,然后区堆顶元素。
* 取堆顶元素以后,需要从下往上堆化
* 然后取堆顶元素对应的邻接表中,更新每个顶点的dist值,并且入队。
*/
class Graph{
constructor(v){
this.v = v;//图中的顶点
this.n = v.length;
this.adj = new Array(this.n);//图中的邻接表
for(let i = 0;i<this.n;i++){
this.adj[i] = [];
}
}
addEdge(s,t,w){
this.adj[s].push(new Edge(s,t,w));
}
dijkstar(s,t){
//从顶点s到顶点t的最短路径
let predecessor = [];
let vertexes = [];
for(let i = 0;i<this.n;i++){
vertexes[i] = new Vertex(i,Number.MAX_SAFE_INTEGER);//初始化顶点集合,使起始顶点到当前顶点的距离是最大的数字
}
let queue = new PriorityQueue(this.v);//构造小顶堆
let inQueue = new Array(this.n).fill(false);//标记是否进入过队列
vertexes[s].dist = 0;//初始化起始顶点的距离为0
queue.add(vertexes[s]);
inQueue[s] = true;//标记初始顶点已经入队了
while(!queue.isEmpty()){
let minVertex = queue.poll();//取堆顶元素 就是距离最小的那个
if(minVertex.id == t){
//到达终点
break;
}
//逐个访问最小元素的邻接表中的顶点 更新他们的dist
for(let i = 0;i<this.adj[minVertex.id].length;i++){
let e = this.adj[minVertex.id][i];//取出邻接点相连的边
let nextVertex = vertexes[e.e];//对应的顶点
//更新顶点中 初始顶点到当前顶点中的最小距离·
if(minVertex.dist + e.w < nextVertex.dist){
nextVertex.dist = minVertex.dist + e.w;
predecessor[nextVertex.id] = minVertex.id;//记录nexvertex的上一个顶点是 堆顶元素
if(inQueue[nextVertex.id]){
//这个邻接节点已经进队 就更新队列中的dist
queue.update(nextVertex);
JavaScript Dijkstra算法 Astart算法
于 2022-01-05 17:28:09 首次发布