BFS宽度优先搜索
- 连通块
- 一个点的所有联通块
- 分层遍历
- 简单图最短路径 (什么是简单图,没有方向,没有权重,没有自己连自己)
- 图的分层遍历
- 拓扑排序
- 任意拓扑序
- 是否有拓扑序 (BFS出来的排序列表的数目和原数目是否相等)
- 字典序最小拓扑序
- 是否唯一拓扑序
java
- 建议使用 ArrayDeque
- 复杂度 O(M + N), M个点 N 个边,如果所有边的相连O(N^2) 通用模板
Queue<Node> q = new ArrayDeque<>();
HashMap<Node, Integer> distance = new HashMap<>();
q.offer(node);
distance.put(node, 0)
while (!q.isEmpty()) {
Node node = q.poll();
for (Node neighbour : node.getNeighbours()) {
if (distance.containsKey(neighbour)) continue;
distance.put(neighbour, distance.get(node) + 1));
q.offer(neighbour);
}
}
几种 BFS
- 树上 BFS
- 矩阵 BFS
- 图上 BFS
- 自己构造图 BFS 邻接矩阵(数组或者用 hashmap)
拓扑排序
- 有向图
- 入度
算法:
- 统计每个点入度
- 将每个入度为0的点作为起点 入队
- 不断拿出点,入度 -1
- 入度为0的点丢回队列