迪杰特斯拉算法求最短路径

本文介绍如何利用JavaScript来实现迪杰斯特拉算法,旨在找出从源节点到图中所有其他节点的最短路径。

前言:

通过JavaScript实现该算法,并求出初始点到各个点的最短路径

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>迪杰特斯拉算法</title>
</head>
<body>
    <script>
        //说明
        //@xiaoD
        //计算第一个节点开始到各个节点的最短路径

        //邻接矩阵
        var data = [
            [0, 4, 6, -1, -1, -1, -1, -1],
            [4, 0, -1, 5, 4, -1, -1, -1],
            [6, -1, 0, 4, 7, -1, -1, -1],
            [-1, 5, 4, 0, -1, 9, 7, -1],
            [-1, 4, 7, -1, 0, 5, 6, -1],
            [-1, -1, -1, 9, 5, 0, 5, 4],
            [-1, -1, -1, 7, 6, 5, 0, 1],
            [-1, -1, -1, -1, -1, 4, 1, 0]
        ];

        //对邻接矩阵进行规范化
        for(var i=0; i<data.length; i++) {
            for(var j=0; j<data.length; j++) {
                if(data[i][j] === -1) {
                    data[i][j] = Infinity;
                }
            }
        }

        //对节点进行字母描述
        var nodeName = []
        //最短路径数组
        var minPath = [];
        //该节点是否已经找到最短路径
        var findMin = [];
        //(找到最短路径节点)的临近节点
        var nearNode;
        //上一个节点
        var preNode = [];

        //初始化数据
        for(var i=0; i<data.length; i++) {
            minPath[i] = data[0][i];
            findMin[i] = false;
            preNode[i] = i;
            nodeName[i] = String.fromCharCode(65+i)
        }
        findMin[0] = true;

        for(var i=1; i<data.length; i++) {

            //找出距离(找到最短路径节点)的节点和距离
            var min = Infinity;
            for(var j=0; j<data.length; j++) {
                if(!findMin[j] && minPath[j] < min) {
                    min = minPath[j];
                    nearNode = j;
                }
            }
            //临近节点也找到最短路径
            findMin[nearNode] = true;

            for(var k=0; k<data.length; k++) {
                if(!findMin[k] && minPath[k] > (min + data[nearNode][k])) {
                    minPath[k] = min + data[nearNode][k];
                    preNode[k] = nearNode;
                }
            }
        }
        var pre;
        var list;
        var result;
        for(var i=0; i<minPath.length; i++) {
            console.log(nodeName[0] + " ----> " + nodeName[i] + " 的最小距离是 " + minPath[i]);
            if(i === preNode[i]) {
                console.log(nodeName[0] + " ----> " + nodeName[preNode[i]] + "\n\n");
            }else{
                pre = i;
                list = [];
                while(pre !== preNode[pre]) {
                    list.push(nodeName[pre]);
                    pre = preNode[pre];
                }
                list.push(nodeName[preNode[pre]], nodeName[0]);
                result = "";
                for(var t=list.length-1; t > 0; t--) {
                    result = result + list[t] +" ----> ";
                }
                result += list[0];
                console.log(result + "\n\n");
            }
        }
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值