📜  门| GATE-CS-2006 |第 83 题(1)

📅  最后修改于: 2023-12-03 15:12:41.454000             🧑  作者: Mango

门 | GATE-CS-2006 |第 83 题

这是一道关于图论中连通性的问题。题目给出了一个有向图,要求我们实现一个函数来确定从给定的源节点出发,是否可以到达给定的终点节点。具体的函数签名和输入输出格式如下:

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)。