📜  用于图的广度优先搜索或 BFS 的Java程序(1)

📅  最后修改于: 2023-12-03 15:40:53.507000             🧑  作者: Mango

用于图的广度优先搜索或 BFS 的Java程序

介绍

广度优先搜索(BFS)是一种用于图像搜索或遍历的算法,它从指定的起点开始遍历图,并探索所有与起点相连通的顶点,然后按照距离顺序逐层向外扩展搜索。

本文将介绍如何使用Java实现图的广度优先搜索算法,展示如何定义图结构并实现基本的BFS算法。

实现步骤

以下是实现广度优先搜索算法的步骤:

  1. 定义图结构
  2. 实现基本的BFS算法
定义图结构

定义一个Graph类,该类将用于表示图。我们需要定义添加和删除边以及查找图节点等基本操作的方法。以下是示例代码:

public class Graph {
    private Map<Integer, List<Integer>> adjacencyList;

    public Graph() {
        this.adjacencyList = new HashMap<>();
    }

    public void addEdge(int source, int destination) {
        if (!this.adjacencyList.containsKey(source)) {
            this.adjacencyList.put(source, new ArrayList<>());
        }
        this.adjacencyList.get(source).add(destination);

        if (!this.adjacencyList.containsKey(destination)) {
            this.adjacencyList.put(destination, new ArrayList<>());
        }
        this.adjacencyList.get(destination).add(source);
    }

    public void removeEdge(int source, int destination) {
        if (this.adjacencyList.containsKey(source)) {
            this.adjacencyList.get(source).remove(Integer.valueOf(destination));
        }

        if (this.adjacencyList.containsKey(destination)) {
            this.adjacencyList.get(destination).remove(Integer.valueOf(source));
        }
    }

    public List<Integer> findNeighbors(int nodeId) {
        return this.adjacencyList.get(nodeId);
    }
}
实现基本的BFS算法

在我们实现BFS算法之前,我们需要定义一个存储节点和它的层数的数据结构。我们可以使用一个简单的NodeWithLevel类来完成此操作。以下是代码:

public class NodeWithLevel {
    int nodeId;
    int level;

    public NodeWithLevel(int nodeId, int level) {
        this.nodeId = nodeId;
        this.level = level;
    }
}

现在我们可以实现基本的BFS算法。我们使用一个队列来存储我们要遍历的节点。我们使用一个HashSet来跟踪我们已经访问过的节点,以防止我们再次遍历它们。以下是BFS算法的Java代码:

import java.util.*;

public class BFS {
    public static List<Integer> bfsTraversal(Graph graph, int startNode) {
        List<Integer> bfsTraversalResult = new ArrayList<>();

        Queue<NodeWithLevel> queue = new LinkedList<>();
        HashSet<Integer> visitedNodes = new HashSet<>();

        queue.add(new NodeWithLevel(startNode, 0));
        visitedNodes.add(startNode);

        while (!queue.isEmpty()) {
            NodeWithLevel currentNode = queue.remove();
            int currentNodeId = currentNode.nodeId;
            int currentLevel = currentNode.level;

            bfsTraversalResult.add(currentNodeId);

            List<Integer> neighbors = graph.findNeighbors(currentNodeId);

            if (neighbors != null) {
                for (int neighbor : neighbors) {
                    if (!visitedNodes.contains(neighbor)) {
                        visitedNodes.add(neighbor);
                        queue.add(new NodeWithLevel(neighbor, currentLevel + 1));
                    }
                }
            }
        }

        return bfsTraversalResult;
    }
}
使用示例

以下是使用示例的代码:

public class Main {
    public static void main(String[] args) {
        Graph graph = new Graph();
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(1, 3);
        graph.addEdge(1, 4);
        graph.addEdge(2, 5);
        graph.addEdge(2, 6);

        List<Integer> bfsTraversalResult = BFS.bfsTraversal(graph, 0);
        System.out.println("BFS Traversal Result: " + bfsTraversalResult);
    }
}

输出结果:

BFS Traversal Result: [0, 1, 2, 3, 4, 5, 6]
结论

使用上述方法和代码,您可以轻松地实现图的广度优先搜索。这是一项非常有用的技能,在计算机科学,人工智能和机器学习等领域都得到广泛应用。