JavaScript Dijkstra算法 Astart算法

/**
 * 最短路径

 * 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);
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值