相关疑难解决方法(0)

在寻找最短路径时,广度优先搜索如何工作?

我做了一些研究,我似乎错过了这个算法的一小部分.我明白了一个广度优先搜索是如何工作的,但我不明白它究竟是如何让我到一个特定的路径,而不是仅仅告诉我,每个单独的节点可以走了.我想解释我困惑的最简单方法是提供一个例子:

例如,假设我有一个这样的图形:

在此输入图像描述

我的目标是从A到E(所有边缘都没有加权).

我从A开始,因为那是我的起源.我排队A,然后立即将A排队并探索它.这产生B和D,因为A连接到B和D.因此我将B和D排队.

我将B排队并探索它,并发现它导致A(已经探索过)和C,所以我排队C.然后我排队D,并发现它导致E,我的目标.然后我将C排队,并发现它也导致E,我的目标.

我逻辑上知道最快的路径是A-> D-> E,但我不确定广度优先搜索有多精确 - 我应该如何记录路径,这样当我完成时,我可以分析结果并查看最短的路径是A-> D-> E?

另外,请注意我实际上并没有使用树,因此没有"父"节点,只有子节点.

java breadth-first-search shortest-path

114
推荐指数
5
解决办法
13万
查看次数

仅返回实际最短路径中的顶点

我知道标题有点乱,但我不知道如何更好地解释它.

我正在做的事情:

使用文本文件中的图形,找到并打印从顶点A到顶点B的最短路径(最小顶点数量).

注意:使用广度优先搜索,而不是Dijkstra.

我得到了什么:

一种在图上应用BFS的工作算法,但没有实际打印出最短路径的好方法.

我很难区分最短路径中的顶点与简单地通过算法运行的顶点,但不是最短路径中的顶点.

例如:找到0到4之间的最短路径.0连接到1,2和3. 1连接到4.我的路径原来是[0,1,2,3,4]而不是[0,1, 4].

我一直没能找到问同样的问题,或者BFS的任何一个角落,通过包括该任何线程,所以我不知道如果我做了这一点,是这样难度比它是什么?

编辑:可能感兴趣的人的代码(如果我避开圈子,根本不确定?)

编辑2:改变了我将路径存储到堆栈的方式.

public String findPath(int v, int w) {
    Queue<Integer> q = new LinkedList<Integer>();
    boolean[] visited = new boolean[g.numVertices()];

    q.add(v);
    Stack<Integer> path = new Stack<Integer>();
    while(q.peek() != null) {
        runBFS(q.poll(),w,visited,q,path);
    }
    return path.toString();
} 

private void runBFS(int v, int w, boolean[] visited, Queue<Integer> q, Stack<Integer> path) {
    if(visited[v]) {
    }
    else if(v == w) {
        path.add(v);
        q.clear();
    }
    else {
        path.add(v);
        visited[v] = true; …
Run Code Online (Sandbox Code Playgroud)

java breadth-first-search shortest-path graph-traversal

4
推荐指数
2
解决办法
1万
查看次数