最短路径算法——Dijkstra算法

2019-11-13 17:34技术博客2174 次浏览

单源点正边权最短路径的经典求法。

let gragh = {
  A: {
    B: 1,
    C: 12
  },
  B: {
    C: 9,
    D: 3
  },
  C: {
    E: 5
  },
  D: {
    C: 4,
    E: 13,
    F: 15
  },
  E: {
    F: 4
  },
  F: {
    
  }
}

function nearestPath (gragh, from, to) {
  let dis = {}, paths = {}, visited = new Map()
  visited.set(from, 1)
  let num = 0
  for (let p in gragh) {
    num++
    if (p === from) {
      dis[p] = 0
    } else if (gragh[from][p]) {
      dis[p] = gragh[from][p]
      paths[p] = [from, p]
    } else {
      dis[p] = Infinity
      paths[p] = []
    }
  }
  while (visited.size < num) {
    let minKey
    for (let key in gragh) {
      if (key === from || visited.has(key)) continue
      if (minKey === undefined || dis[key] < dis[minKey]) {
        minKey = key
      }
    }
    if (minKey === to) break
    visited.set(minKey, 1)
    for (let p in gragh[minKey]) {
      console.log(paths)
      if (p === minKey) continue
      if (dis[p] > dis[minKey] + gragh[minKey][p]) {
        paths[p] = [...paths[minKey], p]
        dis[p] = dis[minKey] + gragh[minKey][p]
      }
    }
  }
  return paths[to]
}

console.log(nearestPath(gragh, 'A', 'C'))

        

¥赞赏
评论(2)
请问你除了在个人网站和SF这样的交流社区做技术分享,是否还在其他地方发布过非技术类文章呢?如果方便分享的话,希望可以获得一个链接,很想看到你更多的作品。谢谢!
回复2020-09-14
非技术类的基本没写过。早前在CSDN写一些比较简单的技术文章,现在很少上去写了。
回复2020-09-14