深度优先搜索_有向图的通路

题目叙述

节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
输入: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;
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页