当前位置: 首页 > article >正文

DFSBFS总结

DFS(深度优先搜索)算法适用于解决以下问题:

图遍历:DFS可以用来遍历图,找到所有节点或者遍历到目标节点;
连通性问题:DFS可以用来判断两个节点之间是否存在路径,比如在迷宫中找出一条从起点到终点的路径;
拓扑排序:DFS可以用来进行拓扑排序,将有依赖关系的任务按照顺序执行;
寻找连通块:DFS可以用来寻找无向图中的连通块,也可以用来找到有向图中的强连通分量;
生成Maze:使用DFS可以生成迷宫。
总之,DFS是一种非常常用的搜索算法,它在很多问题上都有着广泛的应用。

以下是一个简单的Java DFS模板,可以用来解决各种DFS问题:

import java.util.*;

public class DFS {
    // 定义visited数组,用来标记节点是否被访问过
    private boolean[] visited;

    // 定义邻接矩阵graph,表示图的连接关系
    private int[][] graph;

    // 定义节点个数和起始节点start
    private int n, start;

    public void dfs() {
        visited = new boolean[n];
        dfs(start);
    }

    private void dfs(int i) {
        // 标记当前节点为已访问
        visited[i] = true;
        System.out.print(i + " ");
        
        for (int j = 0; j < n; j++) {
            if (graph[i][j] == 1 && !visited[j]) {
                // 如果i和j之间有连接,并且j还没有被访问过,则递归访问j
                dfs(j);
            }
        }       
    }

    public static void main(String[] args) {
        DFS g = new DFS();
        g.n = 5;
        g.start = 0;
        
        g.graph = new int[][]{
            {0, 1, 0, 1, 0},
            {1, 0, 1, 1, 1},
            {0, 1, 0, 0, 1},
            {1, 1, 0, 0, 1},
            {0, 1, 1, 1, 0}
        };
        
        g.dfs();
    }
}


在这个例子中,我们定义了一个DFS类,其中包含了dfs()和dfs(int i)两个方法。在dfs()方法中,我们初始化visited数组,并从起始节点开始访问;在dfs(int i)方法中,我们首先标记当前节点为已访问,并输出它的编号,然后遍历与它相连的所有节点,如果这些节点还没有被访问过,则递归访问它们。

在main方法中,我们创建了一个DFS对象,并定义了一个5个节点的图,其中每个元素表示节点之间的连接关系。最后调用dfs()方法,即可完成DFS遍历。


Java BFS(广度优先搜索)是一种经典的图遍历算法,用于解决各种与图相关的问题,例如:

1. 无权图最短路径问题:在一个无权图中,求从起点到目标点的最短路径。

2. 连通性问题:判断一个无向图是否连通,或者有几个连通分量。

3. 双向BFS问题:s到t的最短路。提供了两个数据结构begQueue和endQueue,以及两个变量begVisited,endVisited。算法执行时每次从大小较小的那一端去继续进行。

4. 零钱兑换问题:给定不同面额的硬币coins和一个总金额amount,编写一个函数来计算可以凑成总金额所需的最少的硬币个数。

5. 二叉树层序遍历问题:打印出一棵二叉树的所有节点值,按照从上到下、从左到右的顺序。 

等等。

因此,Java BFS是解决许多实际问题时常用的算法之一。

以下是一个简单的Java BFS模板,可以用来解决各种BFS问题:

import java.util.*;

public class BFS {
    // 定义visited数组,用来标记节点是否被访问过
    private boolean[] visited;

    // 定义邻接矩阵graph,表示图的连接关系
    private int[][] graph;

    // 定义节点个数和起始节点start
    private int n, start;

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

    public static void main(String[] args) {
        BFS g = new BFS();
        g.n = 5;
        g.start = 0;
        
        g.graph = new int[][]{
            {0, 1, 0, 1, 0},
            {1, 0, 1, 1, 1},
            {0, 1, 0, 0, 1},
            {1, 1, 0, 0, 1},
            {0, 1, 1, 1, 0}
        };
        
        g.visited = new boolean[g.n];
        
        g.bfs();
    }
}


在这个例子中,我们定义了一个BFS类,其中包含了bfs()方法。在bfs()方法中,我们首先创建一个队列,并将起始节点加入队列中,然后标记起始节点为已访问。接着,我们循环处理队列中的节点,对于每个节点,我们输出它的编号,并把与它相连的所有未访问过的节点加入到队列中。最后输出结果即可。

在main方法中,我们创建了一个BFS对象,并定义了一个5个节点的图,其中每个元素表示节点之间的连接关系。我们还初始化了visited数组,并调用bfs()方法来完成BFS遍历。


http://www.kler.cn/a/6307.html

相关文章:

  • [代码随想录23回溯]回溯的组合问题+分割子串
  • 散斑/横向剪切/迈克尔逊/干涉条纹仿真技术分析
  • 嵌入式轻量级开源操作系统:HeliOS的使用
  • Windows下安装Rabbit MQ
  • unity弹出新的类似独立场景窗口独立运行一般怎么实现?
  • 【接口自动化连载】使用yaml配置文件自动生成接口case
  • 《高等工程数学》习题卷(一)
  • 蓝桥杯训练day5
  • 【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)
  • Text to image论文精读GigaGAN: 生成对抗网络仍然是文本生成图像的可行选择
  • day30 ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独
  • OBProxy 路由策略与使用运维-使用和运维
  • c++全排列 next_permutation()函数
  • 字节测试总监,让我们用这份《测试用例规范》,再也没加班过
  • 【故障诊断】基于最小熵反卷积、最大相关峰度反卷积和最大二阶环平稳盲反卷积等盲反卷积方法在机械故障诊断中的应用研究(Matlab代码实现)
  • vue尚品汇商城项目-day03【20.获取Banner轮播图的数据+21.使用swiper轮播图插件】
  • 【ZGC】为什么初始标记需要STW(stop the world) ?
  • 操作系统-AOSOA
  • AnaXNet: Anatomy Aware Multi-label Finding Classification in Chest X-ray
  • java14 使用增强的模式匹配切换表达式
  • Android 热修复小结
  • 从零开始实现一个C++高性能服务器框架----IO协程调度模块
  • word打latex公式显示不成功,出现【 打不出左大括号
  • Springboot高级(一)缓存
  • (七)Tomcat源码阅读:Host组件分析
  • 熬夜肝完~ 阿里P8的Java进阶知识典藏版,我从18K飙到30K