TypechoJoeTheme

至尊技术网

登录
用户名
密码

<Java中的BFS算法:最短路径的正确姿势>

2025-12-15
/
0 评论
/
2 阅读
/
正在检测是否收录...
12/15

1. 数据结构的选择

  • 邻接表:为了高效存储图的结构,选择邻接表作为数据结构。每个节点存储其相邻节点的列表,方便后续遍历。
  • 队列:使用队列来实现广度优先搜索。队列的端点操作(如front()和back())用于取出节点,tail()用于添加节点。

2. 初始化

  • 初始化一个队列,将起始节点加入队列。
  • 初始化一个记录节点的 visited 数组,用于标记已访问的节点。
  • 初始化一个结果数组,用于记录最短路径中的节点。

3. 队列处理

  • 使用队列的front()操作取出起始节点。
  • 对取出的节点进行处理:如果该节点未被访问过,则将其标记为已访问,并将所有相邻节点添加到队列中。
  • 如果该节点已被访问过,则跳过处理。

4. 路径记录

  • 在处理节点时,记录当前节点的父节点,以便后续路径的构建。

5. 循环与终止条件

  • 重复上述步骤,直到队列为空。
  • 如果队列为空时,检查目标节点是否被访问过。如果是,则返回最短路径;否则,返回无路径。

6. 代码实现

java
public class BFSAlgorithm {
public static void main(String[] args) {
// 初始化邻接表
List adjList = new ArrayList<>();
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());
adjList.add(new AdjacencyNode());

    // 初始化队列
    Queue<AdjacencyNode> queue = new LinkedList<>();
    queue.add(startNode);
    visited.add(startNode);
    result.add(startNode);

    while (!queue.isEmpty()) {
        AdjacencyNode u = queue.removeFirst();
        for (AdjacencyNode v : adjList.get(u)) {
            if (!visited.contains(v)) {
                visited.add(v);
                queue.add(v);
                result.add(v);
                // 添加处理下一个节点
                queue.add(v);
            }
        }
    }

    // 检查目标节点是否被访问过
    if (!visited.contains(targetNode)) {
        System.out.println("无路径");
        return;
    }

    // 构造路径
    String path = new StringBuilder();
    Node current = targetNode;
    while (current != null) {
        path.append(current);
        current = result.get(current);
    }
    System.out.println("最短路径为:" + path.reverse());
}

}

代码示例:

java
package com.example.example;

import java.util.*;

class AdjacencyNode {
public int id;
public List adjList;

public AdjacencyNode(int id) {
    this.id = id;
}

}

class BFSAlgorithm {
public static void main(String[] args) {
// 初始化邻接表
List adjList = new ArrayList<>();
adjList.add(new AdjacencyNode(1));
adjList.add(new AdjacencyNode(2));
adjList.add(new AdjacencyNode(3));
adjList.add(new AdjacencyNode(4));
adjList.add(new AdjacencyNode(5));

    // 初始化队列
    Queue<AdjacencyNode> queue = new LinkedList<>();
    queue.add(1);
    visited.add(1);
    result.add(1);

    // BFS循环
    while (!queue.isEmpty()) {
        AdjacencyNode u = queue.removeFirst();
        for (AdjacencyNode v : adjList.get(u)) {
            if (!visited.contains(v)) {
                visited.add(v);
                queue.add(v);
                result.add(v);
            }
        }
    }

    // 检查目标节点是否被访问过
    if (!visited.contains(5)) {
        System.out.println("无路径");
        return;
    }

    // 构造路径
    String path = new StringBuilder();
    Node current = 5;
    while (current != null) {
        path.append(current);
        current = result.get(current);
    }
    System.out.println("最短路径为:" + path.reverse());
}

}

总结:

Java中的BFS算法实现最短路径,需要选择邻接表作为数据结构,使用队列来遍历所有节点。代码实现需要维护队列和标记访问的节点,记录路径,最后检查目标节点是否被访问过。通过代码示例,可以清晰地看到BFS算法的实现细节,确保算法的正确性和高效性。

最短路径队列<JavaBFS
朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/41433/(转载时请注明本文出处及文章链接)

评论 (0)