Java搜索与图论之DFS和BFS算法详解

Java搜索与图论之DFS和BFS算法详解

DFS算法基本原理

DFS(深度优先搜索)指的是从图的某个顶点出发,访问其所有能到达的顶点,并且尽可能深的搜索其中一支支路径的搜索算法。遍历过的点存放到形成的树中。树中每个结点的祖先结点都位于它的所有子树中,它的祖先结点包括它父亲结点和它父亲的祖先结点。DFS一般采用递归或者栈实现,其算法流程如下:

  1. 访问起始顶点
  2. 标记该顶点以表示已访问
  3. 遍历该顶点相邻的所有未访问顶点并递归访问
  4. 如果没有未访问顶点,则回退以访问剩余未访问顶点

DFS算法Java代码实现

public static void dfs(int[][] graph, boolean[] visited, int n, int i) {
    visited[i] = true;
    System.out.print(i + " ");
    for (int j = 0; j < n; j++) {
        if (!visited[j] && graph[i][j] == 1) {
            dfs(graph, visited, n, j);
        }
    }
}

其中,graph是图的邻接矩阵,visited是标记数组,n是图中顶点数量,i是遍历的起始顶点。

BFS算法基本原理

BFS(广度优先搜索)指的是先访问已知起始顶点的直接相邻顶点,再依次访问这些相邻顶点的相邻顶点,并标记为已访问。采用队列的方式实现,算法流程如下:

  1. 创建一个队列并存储起始顶点
  2. 标记起始顶点为已访问
  3. 从队列中获取下一个顶点,访问所有未被访问顶点并标记为已访问
  4. 把这些未被访问的顶点加入队列中
  5. 重复步骤3和4直到队列为空

BFS算法Java代码实现

public static void bfs(int[][] graph, boolean[] visited, int n, int i) {
    visited[i] = true;
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(i);
    while (!queue.isEmpty()) {
        int curr = queue.poll();
        System.out.print(curr + " ");
        for (int j = 0; j < n; j++) {
            if (!visited[j] && graph[curr][j] == 1) {
                visited[j] = true;
                queue.offer(j);
            }
        }
    }
}

其中,graph是图的邻接矩阵,visited是标记数组,n是图中顶点数量,i是遍历的起始顶点。

示例说明1

以如下二维数组表示的图为例:

int[][] graph = {
    {0, 1, 1, 0, 0},
    {1, 0, 1, 1, 0},
    {1, 1, 0, 0, 1},
    {0, 1, 0, 0, 1},
    {0, 0, 1, 1, 0}
};

其中,每行表示一个顶点和其他顶点的连边情况,1表示连通,0表示不连通。

如果起始顶点为2,使用DFS算法,遍历整张图,会输出如下序列:

2 0 1 3 4

如果起始顶点为2,使用BFS算法,遍历整张图,会输出如下序列:

2 0 1 4 3

示例说明2

以如下二维数组表示的图为例:

int[][] graph = {
    {0, 1, 0, 1, 0},
    {1, 0, 1, 0, 0},
    {0, 1, 0, 1, 1},
    {1, 0, 1, 0, 1},
    {0, 0, 1, 1, 0}
};

其中,每行表示一个顶点和其他顶点的连边情况,1表示连通,0表示不连通。

如果起始顶点为0,使用DFS算法,遍历整张图,会输出如下序列:

0 1 2 3 4

如果起始顶点为0,使用BFS算法,遍历整张图,会输出如下序列:

0 1 3 2 4

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java搜索与图论之DFS和BFS算法详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java使用反射创建并操作对象的方法

    Java反射可以在运行时获取类的信息以及动态操作对象,使用反射创建并操作对象的方法如下: 1.获取Class对象 使用反射创建对象,首先需要获取Class对象,有如下三种方式:- 调用Class.forName()- 通过类名.class获取- 使用对象.getClass()方法获取Class对象 示例1:调用Class.forName()方法获取Class…

    Java 2023年5月26日
    00
  • 一篇文章带你Java Spring开发入门

    一篇文章带你Java Spring开发入门 介绍 Java Spring是一款流行的开源框架,用于构建Java应用程序。它提供了很多特性,如依赖注入、面向切面编程等等,使得开发Java应用程序变得更加快捷和高效。本文将介绍Java Spring的入门知识,包括环境配置、Maven项目的创建和依赖管理、Spring框架的使用等等。 环境配置 首先,确保你的电脑…

    Java 2023年5月19日
    00
  • CAS操作的实现原理是什么?

    CAS(Compare And Swap)是一种并发控制机制,用于保证多线程并发修改时的数据一致性。它主要包括三个操作数:内存地址V、旧的预期值A和新的值B。当且仅当内存地址V的值和预期值A相同时,才把新的值B赋值给内存地址V,否则就什么都不做。下面就来详细讲解一下CAS操作的实现原理: CAS操作的实现原理 在计算机能够完成CAS操作的原理中,有两个非常重…

    Java 2023年5月10日
    00
  • 详解jdbc实现对CLOB和BLOB数据类型的操作

    详解JDBC实现对CLOB和BLOB数据类型的操作 什么是CLOB和BLOB CLOB (Character Large OBjects) – 用于存储大文本数据,如文章、博客、新闻等 BLOB (Binary Large OBjects) – 用于存储二进制数据,如图像、音频、视频等 JDBC操作CLOB和BLOB JDBC API提供了对CLOB和BLO…

    Java 2023年5月20日
    00
  • 小菜编程成长记(一 面试受挫——代码无错就是好?)第1/3页

    下面详细讲解“小菜编程成长记(一 面试受挫——代码无错就是好?)第1/3页”的完整攻略。 1. 了解面试的目的和方式 首先我们需要了解,面试的目的是为了寻找合适的人选,而面试的方式则是通过考验面试者的能力和素质来筛选出合适的人选。 因此,在面试时,代码无错只是基本要求,更重要的是要展示自己的思考能力、解决问题的能力、学习能力等方面的优势。 2. 强化代码的可…

    Java 2023年5月23日
    00
  • docker-compose部署配置jenkins的详细教程

    下面是详细讲解“docker-compose部署配置jenkins的详细教程”的完整攻略,步骤如下: 1. 安装Docker和Docker Compose 首先需要安装 Docker 和 Docker Compose,可以参考官网提供的教程进行安装。 Docker安装教程:https://docs.docker.com/engine/install/ Doc…

    Java 2023年5月19日
    00
  • Java面试之Mybatis面试题吐血整理

    Java面试之Mybatis面试题吐血整理是一篇关于Mybatis面试题的文章,旨在帮助Java开发者更好地理解Mybatis框架,并为他们在面试中顺利通过Mybatis相关的技术问题。以下是关于攻略的详细讲解: 文章介绍 在文章介绍中,需要对该篇文章的主旨进行阐述,即为作者整理了一份Mybatis面试题,而这些问题都是在实际工作或者面试中遇到的问题。文章也…

    Java 2023年5月20日
    00
  • Java实现中国象棋的示例代码

    下面是“Java实现中国象棋的示例代码”的完整攻略: 1. 确定需求和分析 在实现中国象棋的过程中,需要先明确需求和进行分析。具体来说,我们需要了解中国象棋的规则、棋盘、棋子等基本信息,然后根据需求进行代码的设计和实现。 2. 代码设计 首先,我们需要了解如何存储和表示棋盘和棋子的信息。一般而言,可以使用二维数组来表示棋盘,然后用整数或字符来表示棋子的种类。…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部