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

题目叙述

节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
输入: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值