面试题 04.01. 节点间通路

题目

节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。

示例1:
输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
输出:true

示例2:
输入:n = 5, graph = [[0, 1], [0, 2], [0, 4], [0, 4], [0, 1], [1, 3], [1, 4], [1, 3], [2, 3], [3, 4]], start = 0, target = 4
输出 true

提示:

  • 节点数量n在[0, 1e5]范围内。
  • 节点编号大于等于 0 小于 n。
  • 图中可能存在自环和平行边。

题解

public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
    // 路径可达
    boolean[] dp = new boolean[n];

    for (int[] node : graph) {
        // 若出发地为start 则设置出发地到目的地可达
        dp[node[0]] = node[0] == start;
    }

    // 保证节点出发地是升序排序
    Arrays.sort(graph, Comparator.comparing(g -> g[0]));

    for (int[] node : graph) {
        if (dp[node[0]]) {
            dp[node[1]] = true;
        }
    }

    return dp[target];
}