程序员面试金典-面试题 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。
图中可能存在自环和平行边。

分析:

将给的边存成map,也就是节点和该节点能到达的节点列表的映射,然后dfs搜索即可。

程序:

class Solution {
    public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
        map = new HashMap<>();
        visited = new int[n];
        for(int[] edge:graph){
            List<Integer> list = map.getOrDefault(edge[0], new ArrayList<>());
            list.add(edge[1]);
            map.put(edge[0], list);
        }
        return dfs(start, target);
    }
    private boolean dfs(int start, int target){
        if(start == target)
            return true;
        visited[start] = 1;
        if(map.get(start) == null)
            return false;
        List<Integer> list = map.get(start);
        for(int i:list){
            if(visited[i] == 0){
                if(dfs(i, target))
                    return true;
            }
        }
        visited[start] = 1;
        return false;
    }

    private HashMap<Integer, List<Integer>> map;
    private int[] visited;
}

 

posted @ 2020-03-05 21:56  silentteller  阅读(589)  评论(0编辑  收藏  举报