跳至主要內容

图的广度优先遍历


图的广度优先遍历

介绍

广度优先遍历(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。在广度优先遍历中,我们从某个顶点开始遍历图,首先访问该顶点,然后访问该顶点的所有相邻顶点,再访问这些相邻顶点的相邻顶点,直到遍历完所有与起始顶点相连通的顶点。

广度优先遍历通常使用队列来实现。具体来说,我们可以从图中的任意一个顶点开始,将其标记为已访问,并将其加入队列中。然后,我们从队列中取出一个顶点v,访问它的所有未被访问过的相邻顶点,并将这些相邻顶点标记为已访问,并依次将它们加入队列中。重复这个过程,直到队列为空,即遍历过程结束。

广度优先遍历可以帮助我们找出图的最短路径、生成最小生成树等问题。另外,广度优先遍历还可以用于解决迷宫问题、求解八数码问题等。

需要注意的是,广度优先遍历的时间复杂度同样可能会达到O(n+m),其中n和m分别是图的顶点数和边数,因此在处理大规模图时,可能需要考虑使用其他的算法。

Java代码实现

public class BFS {
    public static String bfs(Graph g){
        String result = "";
        if (g.vertices < 1){
            return result;
        }
        boolean[] visited = new boolean[g.vertices];
        for(int i=0;i<g.vertices;i++) { 
            if(!visited[i]){ 
                result = result + bfsVisit(g, i, visited); 
            } 
        }
        return result;
    }
    public static String bfsVisit(Graph g, int source, boolean[] visited) {
        String result = "";
        Queue<Integer> queue = new Queue<>(g.vertices);
        queue.enqueue(source);
        visited[source] = true;
        while (!queue.isEmpty()) {
            int current_node = queue.dequeue();
            result += String.valueOf(current_node);
            DoublyLinkedList<Integer>.Node temp = null;
            if(g.adjacencyList[current_node] != null)
                temp = g.adjacencyList[current_node].headNode;
            while (temp != null) {
                if (!visited[temp.data]) {
                    queue.enqueue(temp.data);
                    visited[temp.data] = true; //Visit the current Node
                }
                temp = temp.nextNode;
            }
        }
        return result;
    }
}
上次编辑于:
贡献者: Neil