如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?

Posted

技术标签:

【中文标题】如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?【英文标题】:How to find a path from one vertex to another in a tree using breadth first search? 【发布时间】:2019-03-22 23:48:28 【问题描述】:

我正在尝试实现一个 BFS,它以顶点列表的形式返回从 ab 的路径。我正在一棵树上实现这个 BFS,所以我知道如果我能找到它,这将是最短的路径。然而,到目前为止,我的研究只让我找到了搜索和查找节点的 BSF 算法,而不是返回路径。

我正在处理的输入是最小生成树的邻接矩阵。我必须接受这个并找到从一个点到另一个点的路径。

【问题讨论】:

更多详情?请?这感觉有点像你没有付出太多的努力。但基本思想只是存储一个 BSF 搜索中访问过的所有节点的列表,然后就是路径。 @mackycheese21 我知道看起来可能是这样。我在这方面花了很多时间和精力,但问题是我无法真正尝试实现某些东西,直到我弄清楚我正在实现的是什么。关于你所说的,BFS 不是访问每个节点,所以这个序列不会是从顶点 a 到 b 的路径。 对不起!唔。看看 Dijkstras 算法或 A*。这取决于。你的连接权重吗? BFS 可能不是您想要使用的。 @mackycheese21 在原始图中,边缘被加权,但后来我从中找到了一个最小生成树。所以现在,任何两个顶点只有一个唯一的路径,我只需要一个算法来找到它。因此,可以将树视为未加权。 【参考方案1】:

如果你真的想使用 BFS 来解决这个问题,要跟踪从源到目的地的路径,你需要存储每个访问过的节点的父节点。这是一个没有优化的 BFS 示例。

import java.util.*;

public class bfs 

    static class Node 
        Node parent;
        int x;

        Node (int x) 
            this (x, null);
        

        Node (int x, Node parent) 
            this.parent = parent;
            this.x = x;
        

        void trace () 
            if (parent == null) 
                System.out.print (x);
             else 
                parent.trace ();
                System.out.print ("->" + x);
            
        
    

    static void bfs (int start, int goal, int[][] adj) 
        List<Node> list = new ArrayList<> ();

        list.add (new Node (start));

        while (!list.isEmpty ()) 
            Node cur = list.remove (0);

            if (cur.x == goal) 
                cur.trace ();
                break;
             else 
                for (int i = 0; i < adj[cur.x].length; i++) 
                    if (adj[cur.x][i] == 1) 
                        list.add (new Node (i, cur));
                    
                
            
        
    

    public static void main (String[] args) 
        int[][] adjacency_matrix = 
            0, 1, 1, 0, 0,
            1, 0, 0, 1, 0,
            1, 0, 0, 0, 0,
            0, 1, 0, 0, 1,
            0, 0, 0, 1, 0
        ;
        int start = 0;
        int goal = 4;

        bfs (start, goal, adjacency_matrix);
    


【讨论】:

现在我想到了使用节点搜索算法并不是绝对必要的。我只需要找到一条路径。 有没有办法非递归地做到这一点 是的,它可以在没有递归的情况下完成,但您需要在节点中存储一个数组或列表。 我想通了。谢谢!【参考方案2】:

Dijkstra 或 A* 可能是您想要使用的。不过,这取决于。您似乎在描述的是寻路算法,而不是节点搜索。

【讨论】:

这是有道理的。谷歌搜索时,我在 BFS 上获得了如此多的点击率,以至于我觉得自己走在正确的道路上

以上是关于如何使用广度优先搜索在树中找到从一个顶点到另一个顶点的路径?的主要内容,如果未能解决你的问题,请参考以下文章

广度优先搜索在树中的应用

广度优先搜索在树中的应用——判断对称二叉树

十深度优先 && 广度优先

关于广/宽度优先搜索

算法之深度和广度优先搜索算法

图的遍历之深度优先搜索和广度优先搜索