Day50 - 图论 Part 01

35 阅读1分钟

基础

图论理论基础

对于图,有向,无向,权值,度,出度,入度,连通性(连通图,强连通图,连通分量,强连通分量),图的构造(朴素存储,邻接矩阵,邻接表),图的遍历(DFS 深度优先搜索,BFS 广度优先搜索)都进行了介绍

www.programmercarl.com/kamacoder/%…

深搜理论基础 DFS

DFS和BFS的区别

  • dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,再换方向(换方向的过程就涉及到了回溯)。
  • bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。

DFS 深搜三部曲

  • 确定递归函数
func dfs(curNode *Node)
  • 确定终止条件
if (终止条件) {
    存放结果;
    return;
}

  • 确定递归逻辑
for (选择:本节点所连接的其他节点) {
    处理节点;
    dfs(图,选择的节点); // 递归
    回溯,撤销处理结果
}

BFS 代码实现

www.programmercarl.com/kamacoder/图…

BFS需要用到队列来实现

image.png

刷题

  1. 可达路径

kamacoder.com/problempage…

image.png

总结

路径总和II 的path可以变成[]int 类型吗?可以,但依然需要对每一次递归的path复制到一个新的对象来append 到result中,因为切片类型的参数,传递的是切片的头和长度,而不是切片的底层数组,当修改底层数组的元素是引用传递,而扩容数组不会影响外面的切片,因为长度不变。

链接:juejin.cn/post/751488…