Java 广度优先搜索

广度优先搜索(Breadth-First Search, BFS)是一种图搜索算法,通常用于遍历或搜索树或图的数据结构。它从一个起始节点开始,首先访问所有相邻的节点,然后再从这些相邻节点出发,访问它们的未访问过的相邻节点,依此类推,直到找到目标节点或遍历完所有可达节点。

以下是一个简单的 Java 实现,用于在无向图中进行广度优先搜索。假设图是用邻接表表示的:

import java.util.*;  
  
class Graph {  
    private int numVertices; // 顶点数量  
    private LinkedList<Integer>[] adjLists; // 邻接表  
  
    // 构造函数  
    Graph(int vertices) {  
        numVertices = vertices;  
        adjLists = new LinkedList[vertices];  
        for (int i = 0; i < vertices; i++) {  
            adjLists[i] = new LinkedList<>();  
        }  
    }  
  
    // 添加边  
    void addEdge(int src, int dest) {  
        adjLists[src].add(dest);  
        adjLists[dest].add(src); // 因为是无向图,所以需要双向添加  
    }  
  
    // 广度优先搜索  
    void BFS(int startVertex) {  
        boolean[] visited = new boolean[numVertices]; // 记录节点是否被访问  
        LinkedList<Integer> queue = new LinkedList<>(); // 队列用于BFS  
  
        visited[startVertex] = true;  
        queue.add(startVertex);  
  
        while (!queue.isEmpty()) {  
            int vertex = queue.poll();  
            System.out.print(vertex + " ");  
  
            // 访问所有相邻节点  
            Iterator<Integer> it = adjLists[vertex].listIterator();  
            while (it.hasNext()) {  
                int adjVertex = it.next();  
                if (!visited[adjVertex]) {  
                    visited[adjVertex] = true;  
                    queue.add(adjVertex);  
                }  
            }  
        }  
    }  
  
    public static void main(String[] args) {  
        Graph graph = new Graph(5);  
  
        graph.addEdge(0, 1);  
        graph.addEdge(0, 2);  
        graph.addEdge(1, 3);  
        graph.addEdge(1, 4);  
  
        System.out.println("广度优先搜索(从顶点 0 开始):");  
  
        graph.BFS(0);  
    }  
}

代码解释

  1. Graph 类
    • numVertices:存储图的顶点数量。
    • adjLists:一个邻接表数组,每个元素是一个 LinkedList<Integer>,用于存储与该顶点相邻的顶点。
  2. 构造函数
    • 初始化 numVertices
    • 初始化 adjLists,为每个顶点创建一个空的 LinkedList
  3. addEdge 方法
    • 在无向图中,添加一条从 src 到 dest 的边,需要在 adjLists[src] 中添加 dest,并在 adjLists[dest] 中添加 src
  4. BFS 方法
    • 使用一个布尔数组 visited 记录每个顶点是否被访问过。
    • 使用一个 LinkedList 作为队列,用于存储当前层的节点。
    • 将起始顶点标记为已访问,并将其加入队列。
    • 当队列不为空时,循环执行以下操作:
      • 从队列中取出一个顶点,并打印。
      • 访问该顶点的所有相邻顶点,如果相邻顶点未被访问过,则将其标记为已访问并加入队列。
  5. main 方法
    • 创建一个图并添加一些边。
    • 调用 BFS 方法从顶点 0 开始进行广度优先搜索,并打印结果。

输出

广度优先搜索(从顶点 0 开始):  
0 1 2 3 4

这个输出表示从顶点 0 开始,按照广度优先的顺序访问了所有顶点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值