如果不需要确定当前遍历到了哪一层,BFS模板如下。 while queue 不空: cur = queue.pop() for 节点 in cur的所有相邻节点: if 该节点有效且未访问过: queue.push(该节点) 如果要确定当前遍历到了哪一层,BFS模板如下。 这里增加了level表示当 ...
分类:
其他好文 时间:
2020-07-28 22:38:05
阅读次数:
77
题目 传送门 思路 这题的主要难点在于我们不知道是三个起点分别在哪里 但是我们知道三条路径一定会交于某一个点 基于此,我们考虑枚举这一个点, 那么算法的复杂度就卡在这个点和三个王国的国土的最短路径上面 这个可以用bfs来预处理,$dis[k][i][j]\(第k个王国距离点\)(i,j)$的最短距离 ...
分类:
其他好文 时间:
2020-07-28 00:14:30
阅读次数:
71
多源bfs 1.算法分析 多源bfs就是一开始有很多的源头,不只一个源点。处理的方法:一开始直接把所有源点放入队列;或者建立一个虚拟源点,虚拟源点到每个源点的距离为0 2.例题 acwing173矩阵距离 给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: d ...
分类:
其他好文 时间:
2020-07-27 13:41:08
阅读次数:
59
双端队列广搜 1. 算法分析 双端队列广搜算法只适用于边权只有0和1的情况,本质上是对dijkstra堆优化版本的再次优化。由于dijkstra堆优化版本每次要把最小值从队头拿出,然后更新其他值后插入队列。而当边权只有0和1时,当处理的边权为0,那么更新完仍然为最小值,直接放入队头;为1则插入队尾。 ...
分类:
其他好文 时间:
2020-07-27 13:40:39
阅读次数:
68
双向bfs和双向dfs 1. 算法分析 当进行的变换是可逆的时候,且规定步数的上限时,可以使用双向dfs或双向bfs从源点和终点一起搜索。这样可以把时间从O(n)->O(n/2) 如果dfs调栈超过1e5时,那么考虑双向bfs 写法技巧 双向dfs 第一个dfs先搜索前一半的空间,打表存储所有可达的 ...
分类:
其他好文 时间:
2020-07-27 13:39:54
阅读次数:
66
bfs最短路与最小步数模型 1. 算法分析 最短路:从A点走到B点的最小距离 最小步数:从状态A到状态B的最小变化数,本质就是最短路 2. 例题 2.1 最短路 acwing1076迷宫问题 给定N*N数组,每个元素只有0和1,求从(0, 0)走到(n - 1, n - 1)的最短路,输出其路径 # ...
分类:
其他好文 时间:
2020-07-27 13:39:28
阅读次数:
64
floodfill 1.算法分析 floodfill就是求出连通块的算法,一般可以采用dfs或者bfs,但是dfs容易爆栈,故而采用bfs为佳 2. 例题 acwing1097池塘计数 一块N * M的土地,其中有'W'和'.'组成,'.'为土地,'W'为水,水的八个方向可以连在一起形成池塘,问一块 ...
分类:
其他好文 时间:
2020-07-27 13:37:49
阅读次数:
56
102. 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 示例: 二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果: [ [3], [9,20], [15,7] ] # ...
分类:
其他好文 时间:
2020-07-26 15:44:06
阅读次数:
63
题意: 给出$T$组数据,每组数据给出$N$和$M$,表示接下去$N$行$M$列。 图中“#”代表草,可以点燃;“.”点代表不能点燃;“#”和“.”都以走。 现在需要同时点两把火(位置可以重合),火的燃烧方向是上下左右,可以同时进行(注意!:不是一次只能一个方向,可以同时上下左右)。 若能烧完所有草 ...
分类:
其他好文 时间:
2020-07-26 15:19:03
阅读次数:
49
这个层序遍历要求返回每层的节点,正常的BFS从队列中弹出一个节点后就判断其有没有左子树和右子树,所以直接用BFS实现的话无法分层输出。 需要记录每层的节点数目,增加一个for循环就可以了。 /** * Definition for a binary tree node. * public class ...
分类:
编程语言 时间:
2020-07-25 23:51:28
阅读次数:
72