Question 0 Traversal & Reachable模版

Graph Node

// Some code
class GraphNode {
    int id;
    List<GraphNode> neighbors;
    
    // assume the graphNode has already overridden hashCode(), equals(), toString();
    @Override
    public int hashCode(){
    
    }
    
    @Override
    public int equals() {
    }
    
    @Override
    public int toString() {
    }
}

DFS对点的遍历

  1. 一点出发,遍历到我们能遍历到的所有点

  • 每个点可能被到达多次(环,多个父亲节点)

  • Logic

    • 如果访问到当前的点,赶紧回头(不访问)

      • 否则,访问这个点,同时继续访问他的neighbors

  1. 对于不联通图中有多个联通分量

  • 要想遍历出所有的点,不可能从一个点出发

  • 有几个联通分量,需要从几个点出发/需要出发几次,每一次从一个新的connect里挑选一个点出发

Follow Up:

  • 联通分量里最多的点是多少?

    • 记录每个联通分量里的点数,每次出发都得记录一下这次出发遍历;轭多少点

    • Maximum it

  • 有多少个联通分量包含最多的点?

    • 实际记录下来这个联通分量有哪些点,有多少点

    • 筛选出拥有最多联通分量点数的所有联通分量

BFS对点的遍历

同样的逻辑,同样的操作(expansion and generation), 注意防止多次generate或者expand

去重的位置

  • 既可以在exapansion的时候去重。

    • 允许一个点被generate多次,但是只对第一次exapnd的这个点进行访问,后面我发现再expand到已经visited过的node,直接ignore

  • 也可以在Generation的时候去重。

    • 不允许一个点被generate多次,每一个点如果你最多只放进queue一次,那么它也就至多被拿出来一次

  • 优缺点比较

    • Expansion去重:必然正确,但是缺点为空间复杂度高(queue size不能保证最大的O(V))

    • Generation去重:空间好,Queue的wize至多不会超过O(V),缺点是不一定正确(connectivity and reachable problem一定正确,但是shortest path and etc 不一定正确)

DFS对connection& reachable

BFS对connection& reachable

对边的遍历:Backtracking(see the future section)

The Representation of the Graph in these questions

面试中图论的基本要素

  • 图论面试的第零步: this is actually a graph problem (model)

  • 面试中第一步: graph building (u - v) 构图请单独写一个helper function

题库喜欢的表示方法1: int[][] graph

  • list of all edges,甚至可以是权重

  • 本质就是更新这两个map

    • Map<Integer, Map<Integer, Integer>> graph = new HashMap<>()

      • Map<u, Map<v, weight>> graph

    • Map<Integer, Integer> IndegreeMap = new HashMap<>();

      • Map<u, indegree>

Case 1: Telling me is an Undirected Graph

Case 2: Telling me is a Directed Graph

题库喜欢的表达方法2: int[][] matrix 扔给你个地图

  • example: grid/matrix == [[0 0 (0,1) 1 1 ], [0 1(1, 1) 1 2], [0 1 1 0(2,3)], [0 0 1 0]]

  • 坐标当点:

    • 方向:二方向/四方向/八方向

Question 1: 用每个点的matrix坐标表示一个node会不会超界

Question 2 方向怎么办?

Use Case: 给你一个点(curX, curY) 能不能访问所有邻居

Last updated