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日

相关文章

  • Spring Bean的8种加载方式总结

    Spring Bean的8种加载方式总结 在Spring框架中,Bean是我们经常使用的核心概念之一。Spring提供了多种Bean加载方式,以适应不同的场景和需求。本文将对Spring Bean的8种加载方式进行详细讲解,并通过示例说明。 1. 通过XML文件加载Bean 最传统的方式是使用XML文件来定义Bean。我们可以在XML中使用<bean&…

    Java 2023年5月31日
    00
  • Java中字符串转int数据类型的三种方式

    当我们在Java中需要将字符串类型的数据转换成整型(int)时,通常会遇到以下三种情况: 使用Integer.parseInt方法 其中parseInt方法是Java中将字符串解析成整数的一个常用方法。 String str = "123"; int num = Integer.parseInt(str); System.out.prin…

    Java 2023年5月27日
    00
  • Java基于JDBC连接数据库及显示数据操作示例

    Java基于JDBC连接数据库及显示数据操作示例 简介 JDBC(Java Database Connectivity)是一组用于操作数据库的接口。它允许Java应用程序与各种类型的关系型数据库进行通信并执行与数据库相关的操作(如查询、更新和删除数据等)。 在Java中,可以通过JDBC API建立Java应用程序与数据库之间的连接。本文将介绍如何使用JDB…

    Java 2023年5月19日
    00
  • Java实现学生管理系统(控制台版本)

    Java实现学生管理系统的控制台版本是一个常见的练手项目,同时也是Java编程语言的入门级别的练习项目,其主要目的是通过实现一个简单的学生信息管理系统来训练Java编程的基本能力。 以下是实现Java学生管理系统的大致步骤: 1. 设计学生类 学生类是整个学生信息管理系统的核心,需要包含学生的基本信息,例如姓名、学号、性别、年龄等。 示例代码: public…

    Java 2023年5月19日
    00
  • java实现图形化界面计算器

    下面为您详细讲解“Java实现图形化界面计算器”的完整攻略。 1. 准备工作 在开始之前,需要确保您已经正确安装了Java开发环境(JDK),以及Java集成开发工具(IDE),如Eclipse或IntelliJ IDEA。 2. 创建界面 使用Java Swing工具包,可以很容易地创建图形化用户界面。您可以通过创建一个JFrame实例作为主窗口,然后添加…

    Java 2023年5月23日
    00
  • Java利用File类创建文件的示例代码

    针对Java利用File类创建文件的示例代码,下面是一份完整的攻略。 创建文件的步骤 Java利用File类创建文件的步骤如下: 创建一个File对象,用于表示要创建的文件路径及文件名。 判断路径是否存在,不存在则创建所有目录。 调用File类中的createNewFile()方法创建文件。 示例代码1:创建单层文件 接下来,我们来看一下创建单层文件的示例代…

    Java 2023年5月20日
    00
  • java读取txt文件并输出结果

    下面是“Java读取txt文件并输出结果”的完整攻略: 1. 读取txt文件 1.1 创建File对象 首先,我们需要创建一个File对象,用来指定要读取的txt文件的路径及文件名。例如,读取名为example.txt的文件,代码如下: File file = new File("example.txt"); 1.2 创建FileRead…

    Java 2023年5月26日
    00
  • java遍历读取xml文件内容

    下面我将详细讲解Java遍历读取XML文件内容的完整攻略。 一、使用DOM方式读取XML文件 引入相关依赖:需要在项目中引入相关的dom4j和jaxen库。 创建SAXReader对象,利用SAXReader对象解析XML文件。 SAXReader reader = new SAXReader(); Document document = reader.re…

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