微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 BFS Graph 搜索 JavaScript 中跟踪路径

如何解决如何在 BFS Graph 搜索 JavaScript 中跟踪路径

我正在研究 BFS 算法,但很难弄清楚如何跟踪最短路径。
在我使用的代码下方:

const graph = {
  1: [2,3,4],2: [5,6],3: [10],4: [7,8],5: [9,10],7: [11,12],11: [13],};

function bfs(graph,start,end) {
  let queue = [...graph[start]];
  let path = [start];
  let searched = [];
  while (queue.length > 0) {
    let curVert = queue.shift();
    if (curVert === end) {
      return path;
    } else if (searched.indexOf(curVert) === -1 && graph[curVert]) {
      queue = [...queue,...graph[curVert]];
      searched.push(curVert);
      path.push(curVert);
    }
  }
}

console.log(bfs(graph,1,13));

作为函数调用的回报,我想得到的是最短路径。在本例中为 [1,4,7,11,13]

解决方法

您还需要存储每个访问过的节点的路径。

const graph = { 1: [2,3,4],2: [5,6],3: [10],4: [7,8],5: [9,10],7: [11,12],11: [13] };

function bfs(graph,start,end) {
    let queue = [[start,[]]],seen = new Set;

    while (queue.length) {
        let [curVert,[...path]] = queue.shift();
        path.push(curVert);
        if (curVert === end) return path;

        if (!seen.has(curVert) && graph[curVert]) {
            queue.push(...graph[curVert].map(v => [v,path]));
        }
        seen.add(curVert);
    }
}

console.log(bfs(graph,1,13));

,

对于每个顶点,保持其“前一个”顶点。由于没有回溯,一旦设置,前一个顶点就不会改变。同时,“上一个”地图将跟踪已经访问过的顶点。找到结束顶点后,向后迭代“上一个”映射以计算路径。

const graph = {
  1: [2,11: [13],};


function bfs(graph,end) {
    let queue = [start]
    let prev = {[start]: null}

    while (queue.length > 0) {
        let curr = queue.shift();

        if (curr === end) {
            let path = [];

            while (curr) {
                path.unshift(curr);
                curr = prev[curr];
            }

            return path;
        }

        if (curr in graph) {
            for (let v of graph[curr]) {
                if (!(v in prev)) {
                    prev[v] = curr;
                    queue.push(v);
                }
            }
        }
    }
}

console.log(bfs(graph,13));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。