程序员面试金典-面试题 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; }