一、题目
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
点击此处跳转题目。
示例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
提示:文章来源:https://www.toymoban.com/news/detail-704608.html
- 节点数量n在[0, 105]范围内。
- 节点编号大于等于 0 小于 n。
- 图中可能存在自环和平行边。
二、C# 题解
使用BFS方法寻找通路,代码如下:文章来源地址https://www.toymoban.com/news/detail-704608.html
public class Solution {
public bool FindWhetherExistsPath(int n, int[][] graph, int start, int target) {
// 建立邻接表
Dictionary<int, List<int>> dic = new Dictionary<int, List<int>>();
for (int i = 0; i < graph.Length; i++) {
int p = graph[i][0], q = graph[i][1];
if (dic.ContainsKey(p) && !dic[p].Contains(q)) dic[p].Add(q);
else dic[p] = new List<int> {q};
}
// BFS
Queue<int> queue = new Queue<int>();
queue.Enqueue(start);
do {
int node = queue.Dequeue(); // 取出结点
if (node == target) return true; // 判断是否为目标对象
if (!dic.ContainsKey(node)) continue; // 如果邻接表不存在该结点,则直接跳过
for (int i = 0; i < dic[node].Count; i++) // 遍历邻接表,继续找后续节点
queue.Enqueue(dic[node][i]);
dic.Remove(node); // 访问过该结点,因此从邻接表中删除记录
} while (queue.Count != 0);
return false;
}
}
- 时间复杂度: O ( n + e ) O(n+e) O(n+e),其中 e e e 为有向图的边数。
- 空间复杂度: O ( n ) O(n) O(n)。
到了这里,关于LeetCode 面试题 04.01. 节点间通路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!