📅  最后修改于: 2023-12-03 15:12:41.454000             🧑  作者: Mango
这是一道关于图论中连通性的问题。题目给出了一个有向图,要求我们实现一个函数来确定从给定的源节点出发,是否可以到达给定的终点节点。具体的函数签名和输入输出格式如下:
def check_reachability(graph: Dict[str, List[str]], src: str, dest: str) -> bool:
"""
:param graph: 有向图的邻接表表示
:param src: 起始节点
:param dest: 终止节点
:return: 布尔值,表示是否可以从起点到达终点
"""
pass
这是一道基础的图论问题,我们可以使用 BFS 或者 DFS 来解决。我们从起始节点开始 BFS(或 DFS),并标记已访问节点,每当访问到一个节点时,我们遍历其邻接点,如果邻接点还没有被访问,则将它们加入队列(或栈)中等待下一次访问。直到我们找到终点,或是队列(或栈)为空,我们就可以判断是否可以从起点到达终点了。
我们可以用 Python 中的字典来表示图,其中键为节点名,值为节点的邻接点列表。首先我们需要标记所有节点为未访问状态,使用一个集合来保存已经访问过的节点,当我们访问一个节点时,就将其从未访问集合中删除。
from typing import Dict, List
def check_reachability(graph: Dict[str, List[str]], src: str, dest: str) -> bool:
# 标记所有节点为未访问状态
not_visited = set(graph.keys())
# 记录已经访问过的节点
visited = set()
# BFS
queue = [src]
while queue:
node = queue.pop(0)
visited.add(node)
not_visited.remove(node)
if node == dest:
return True
for neighbor in graph[node]:
if neighbor not in visited:
queue.append(neighbor)
return False
用 BFS 或 DFS 遍历一张有 n 个节点的图,时间复杂度都是 O(n+m),其中 m 表示有向边的数量。在最坏情况下,每个节点都会被访问一次,每条边都被遍历一次,所以时间复杂度为 O(n+m)。
空间复杂度则取决于队列(或栈)的长度,最长可能为 O(n),即当图是一条链的情况。在最坏情况下,队列中每个节点都会被存储一次,所以空间复杂度为 O(n)。