持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
一、题目描述:
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
示例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。 图中可能存在自环和平行边。
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ro… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
1.创建邻接表map,通过Map,构建图的邻接表。key存储每个节点,value存储该节点能到达的其他节点, 新出现的节点,对应的value为空列表
- 建一个函数进行广度遍历,判断是否start与target之间是否有通路
- 维护一个队列:从start节点开始访问,访问过程中start能到达的节点继续入列
- 判断queue是否为空,不为空就继续取值,判断是否存在target目标节点 取出队列中的节点,从而得到对应联通的其他节点,判定是否存在target。
- 当前节点temp不能通往其他任何一个节点 或 之前已经访问过了,则跳过此次循环
- 用数组标记新的节点,并入列queue
三、AC 代码:
class Solution {
public boolean findWhetherExistsPath(int n, int[][] graph, int start, int target) {
Map<Integer, List<Integer>> map = new HashMap<>();
for (int[] po : graph){
if (!map.containsKey(po[0])){
map.put(po[0], new ArrayList<>());
}
map.get(po[0]).add(po[1]);
}
return hasPath(n, map, start, target);
}
public boolean hasPath(int n, Map<Integer, List<Integer>> map, int start, int target){
LinkedList<Integer> queue = new LinkedList<>();
queue.add(start);
boolean[] visited = new boolean[n];
visited[start]=true;
while (!queue.isEmpty()){ // while
int temp = queue.pop();
List<Integer> list = map.get(temp);
if (list == null){
continue;
}
for (int num : list){
if (num == target)
return true;
if (visited[num] == true)
continue;
visited[num] = true;
queue.add(num);
}
}
return false;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助,期待您找到心意的工作和满意的offer
期待下次再见~
\