BFS

85 阅读1分钟

BFS宽度优先搜索

  1. 连通块
  • 一个点的所有联通块
  1. 分层遍历
  • 简单图最短路径 (什么是简单图,没有方向,没有权重,没有自己连自己)
  • 图的分层遍历
  1. 拓扑排序
  • 任意拓扑序
  • 是否有拓扑序 (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

  1. 树上 BFS
  2. 矩阵 BFS
  3. 图上 BFS
  4. 自己构造图 BFS 邻接矩阵(数组或者用 hashmap)

拓扑排序

  1. 有向图
  2. 入度

算法:

  1. 统计每个点入度
  2. 将每个入度为0的点作为起点 入队
  3. 不断拿出点,入度 -1
  4. 入度为0的点丢回队列