面试题 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];
}