点间通路· 6 月更文挑战

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

一、题目描述:

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

示例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。 图中可能存在自环和平行边。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  • 使用DFS「深度优先搜索」进行递归搜索确,确保当前路径未被访问,为了防止图中自环出现死循环的情况,逐渐压缩搜索区间,直至最终找到starttarget在同一个路径内,则说明查找成功,
  • 当图出现闭环时,则会出现死循环情况,为了防止这种情况,就必须在每次递归的过程中标志已走的路径。
  • 采用DFS解决的过程中,应当注意当正序递归搜索时,会出现超时的情况,采用逆序搜索的方法解决

三、AC 代码:

class Solution {
 private boolean[] visited = null;
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
    this.visited = new boolean[graph.length];
    return helper(graph, start, target);
}
​
private boolean helper(int[][] graph, int start, int target) {
    for (int i = 0; i < graph.length; ++i) {
        if (!visited[i]) {
            if (graph[i][0] == start && graph[i][1] == target) {
                return true;
            }
            visited[i] = true;
            if (graph[i][1] == target && helper(graph, start, graph[i][0])) {
                return true;
            }
            visited[i] = false;
        }
    }
    return false;
}
}
​

四、总结:

image-20220608092516970

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助,期待您找到心意的工作和满意的offer

期待下次再见~

\