seamew的妙妙屋seamew的妙妙屋
首页
  • kafka监控
  • my-spring
  • Gitee
  • Github
首页
  • kafka监控
  • my-spring
  • Gitee
  • Github
  • BUG

    • BeanUtils报错
    • Thread的名字问题
  • JAVA

    • Threadlocal
    • 线程池源码分析
  • JS进阶

    • JS开发技巧
  • linux

    • centos防火墙
    • vagrant
    • 正则表达式
  • springboot进阶学习

    • @Configuration和@Bean注解
    • springboot接收参数详解
    • springboot配置多数据源
    • 事务导致多数据源切换失败
  • spring进阶学习

    • aop创建代理基本流程
    • 三级缓存解决循环依赖
  • 云原生

    • 自动化部署
  • 前端开发

    • vue-computed计算属性引发的BUG
  • 大数据

    • kafka事务
    • zookeeper
  • 算法

    • 动态规划

      • 动态规划基础理论
      • 抛骰子和为k的概率
    • 回溯算法

      • used数组是局部还是全局
      • 最优解快速返回
    • 图论

      • dfs简介
    • 多线程

      • 打印ABC
    • 贪心

      • 小于n的最大数字

1、什么是图?

一幅图是由节点和边构成的,逻辑结构如下:

image-20220922143626656

图一般有两种存储结构分为:

  1. 邻接表

image-20220922144054814

  1. 邻接矩阵

image-20220922144145918

// 邻接表
// graph[x] 存储 x 的所有邻居节点
vector<vector<int>> graph

// 邻接矩阵
// matrix[x][y] 记录 x 是否有一条指向 y 的边
vector<vector<int>> matrix

2、dfs算法模板

void dfs(参数) {
    处理节点;
    if (终止条件) {
        存放结果;
        撤销处理结果;--(可选)
        return;
        // 这里也可以选择不return,那就没有必要撤销了
    }
    for (选择:本节点所连接的其他节点) {
        dfs(图,选择的节点); // 递归
    }
    回溯,撤销处理结果
}

3、dfs和回溯算法的区别

这里先给出回溯算法的模板

void backtracking(参数) {
    if (终止条件) {
        存放结果;
        return;
    }
    for (选择:本层集合中元素(树中节点的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯,撤销处理结果
    }
}

相同点:

  • dfs也是回溯算法的一种,都是递归思想的具体体现

不同点:

  • 回溯算法的「做选择」和「撤销选择」在 for 循环里面,而dfs算法在for循环外面
  • 回溯算法关注的不是节点,而是树枝。
  • dfs算法关注节点。是因为一个图可以有独立的节点,他们之间没有边进行连接。
上次更新: 2026/3/21 07:25