题目叙述
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
输出:true
思考
对于图的搜索,借助邻接表结构,先创建一个邻接表,然后借助dfs。具体见代码注释。
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
// 链表数组 表示邻接表结构
List<Integer>[] adj = new ArrayList[n];
// 标记数组,标记是否遍历该节点
boolean[] flags = new boolean[n];
// 循环构建邻接表
for(int[] geo : graph){
int from = geo[0];
int to = geo[1];
if(adj[from] == null){
adj[from] = new ArrayList<>();
}
adj[from].add(to);
}
return dfs(adj,start,target,flags);
}
// dfs
public boolean dfs(List<Integer>[] adj,int start,int target,boolean[] flags){
// 确定停止条件,开始终点相同,说明目的达到,返回 true
if(start == target){
return true;
}
// 标记成已遍历
flags[start] = true;
// 获取以传入节点为开启的链表
List<Integer> list = adj[start];
// 判空,说明这个节点是不可达的
if(list == null){
return false;
}
for(Integer next: list){
if(flags[next] == true){
continue;
}
if(dfs(adj,next,target,flags)){
return true;
}
}
return false;
}