JS实现狄克斯特拉算法(Dijkstra)

302 阅读1分钟

image.png


let nodeMap = {
    start: {
        A: 5,
        C: 2
    },
    A: {
        B: 4,
        D: 2
    },
    C: {
        D: 7,
        A: 8
    },
    B: {
        D: 6,
        end: 3
    },
    D: {
        end: 1
    }
}

let nodeCostMap = {
    end: Infinity
}
let completedNode = []
const getMinCost = () => {
    let min = -1;
    let minKey = ''
    for (let key in nodeCostMap) {
        if (key !== 'end' && !completedNode.includes(key)) {
            if (min !== -1) {
                if (min > nodeCostMap[key]) {
                    min = nodeCostMap[key]
                    minKey = key
                }
            } else {
                min = nodeCostMap[key]
                minKey = key

            }
        }
    }
    return { minKey, min }
}
const getMinimum = (data, dataKey, sum) => {
    let itemData = data[dataKey]
    if (itemData) {
        for (let key in itemData) {
            if (key in nodeCostMap) {
                if (nodeCostMap[key] > itemData[key] + sum) {
                    nodeCostMap[key] = itemData[key] + sum
                }
            } else {
                nodeCostMap[key] = itemData[key] + sum
            }
        }
    }

    completedNode.push(dataKey)
    let { minKey, min } = getMinCost()
    if (minKey) {
        getMinimum(nodeMap, minKey, min)
    } else {
        return
    }

}
getMinimum(nodeMap, 'start', 0)
console.log(nodeCostMap.end)