龙空技术网

JAVA-树|图-广度优先搜索

Bit旅人 151

前言:

现时大家对“无向图建立”大概比较重视,小伙伴们都想要剖析一些“无向图建立”的相关文章。那么小编也在网络上汇集了一些对于“无向图建立””的相关知识,希望你们能喜欢,各位老铁们一起来了解一下吧!

广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树或图的算法。这个算法从根节点开始,然后检查所有相邻的节点。如果一个节点没有被访问过,它就递归地访问该节点的所有未访问过的相邻节点。这个过程会持续进行,直到找到要搜索的特定节点或者遍历了所有的节点。

广度优先搜索的特点是它按照“层次”进行搜索,先搜索距根节点近的节点,然后再逐渐向外搜索。因此,它在解决诸如最短路径问题、网络流量问题等需要“层次”概念的场景中特别有用。

广度优先搜索的时间复杂度通常是O(V+E),其中V是顶点的数量,E是边的数量。这是因为在最坏的情况下,我们可能需要访问图中的所有顶点和边。

下面是一个简单的广度优先搜索的Java代码示例:

import java.util.*;class Graph {    private int numVertices; // Number of vertices    private LinkedList<Integer> adjLists[]; // Adjacency Lists    Graph(int vertices) {        numVertices = vertices;        adjLists = new LinkedList[vertices];        for (int i = 0; i < vertices; i++) {            adjLists[i] = new LinkedList<>();        }    }    void addEdge(int v1, int v2) {        adjLists[v1].add(v2);        adjLists[v2].add(v1); // 在无向图中添加边    }    void BFS(int s) {        boolean visited[] = new boolean[numVertices]; // 标记数组,用于追踪节点是否被访问过        LinkedList<Integer> queue = new LinkedList<Integer>(); // 创建一个队列用于广度优先搜索        visited[s] = true; // 标记起始节点为已访问        queue.add(s); // 将起始节点加入队列        while (queue.size() != 0) {            s = queue.poll(); // 出队,获取队列中的第一个元素            System.out.print(s + " "); // 访问节点            Iterator<Integer> i = adjLists[s].listIterator(); // 获取该节点的邻接节点列表            while (i.hasNext()) {                int n = i.next(); // 获取下一个邻接节点                if (!visited[n]) { // 如果邻接节点未被访问过                    visited[n] = true; // 标记为已访问                    queue.add(n); // 将其加入队列中以待后续访问                }            }        }    }    public static void main(String args[]) {        Graph g = new Graph(4);        g.addEdge(0, 1);        g.addEdge(0, 2);        g.addEdge(1, 2);        g.addEdge(2, 0);        g.addEdge(2, 3);        System.out.println("Breadth First Traversal (starting from vertex 2):");        g.BFS(2); // 从节点2开始进行广度优先遍历        // 执行结果:        // Breadth First Traversal (starting from vertex 2):        // 2 0 1 3    }}

以上代码创建了一个具有4个节点的图,并添加了一些边。然后从节点2开始进行广度优先遍历。在遍历过程中,它将访问每个节点,并按照它们的层次顺序输出。

标签: #无向图建立