Leetcode 面试题 04.01.节点间通路
1 题目描述(Leetcode题目链接)
节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。
输入:n = 3, graph = [[0, 1], [0, 2], [1, 2], [1, 2]], start = 0, target = 2
输出:true
输入: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。
- 图中可能存在自环和平行边。
2 题解
图的深度优先搜索或广度优先搜索都可以做,先构建邻接表,把自环和平行边都去掉,然后从start进行深度优先搜索,使用color表示节点的访问情况。0,1,2分别表示未访问,正在访问,访问完毕。
class Solution:
def findWhetherExistsPath(self, n: int, graph: List[List[int]], start: int, target: int) -> bool:
Adj = collections.defaultdict(list)
for u, v in graph:
if u != v and v not in Adj[u]:
Adj[u].append(v)
color = [0]*n
def dfs(u):
color[u] = 1
for v in Adj[u]:
if color[v] == 0:
dfs(v)
color[u] = 2
dfs(start)
return color[target] != 0