📌  相关文章
📜  查找无向图中两个顶点之间是否存在路径(1)

📅  最后修改于: 2023-12-03 14:55:34.692000             🧑  作者: Mango

无向图中是否存在路径

在无向图中,给定两个顶点,我们需要判断它们之间是否存在路径。这个问题可以用深度优先搜索(DFS)或广度优先搜索(BFS)算法来解决。

深度优先搜索

深度优先搜索是从一个顶点开始,沿着一条边走到底,直到不能再走为止,然后回溯到前一个节点,继续走其他的路径,直到找到目标节点或者遍历完所有可达节点。

下面是一个用DFS解决这个问题的代码片段:

def dfs(graph, start, end, visited=set()):
    visited.add(start)
    if start == end:
        return True
    for neighbor in graph[start]:
        if neighbor not in visited:
            if dfs(graph, neighbor, end, visited):
                return True
    return False

这个函数接受三个参数:图(用邻接表表示)、起点和终点。visited是用来记录已经访问过的节点。我们首先将起点加入visited,若起点即为终点,返回True。否则遍历起点的所有邻居节点,若该节点还未访问过,则递归调用dfs函数。如果找到了路径,返回True,否则返回False。

广度优先搜索

广度优先搜索是从一个顶点开始,先访问所有直接连通的顶点,然后按照它们被访问的顺序依次访问它们的邻居节点,直到找到目标节点或者遍历完所有可达节点。

下面是一个用BFS解决这个问题的代码片段:

def bfs(graph, start, end):
    visited = set()
    queue = [(start, [start])]
    while queue:
        (node, path) = queue.pop(0)
        visited.add(node)
        for neighbor in graph[node]:
            if neighbor == end:
                return path + [neighbor]
            elif neighbor not in visited:
                queue.append((neighbor, path + [neighbor]))
    return None

这个函数也接受三个参数:图、起点和终点。visited和queue也是用来记录已经访问过的节点和还未被访问的节点。我们首先将起点加入队列,并将其路径设置为[start]。然后不断取出队列中的节点,若该节点是终点,返回路径上所有节点,否则将该节点的所有邻居节点加入队列。

总结

以上是用DFS和BFS两种算法解决无向图中是否存在路径的问题的代码片段。这两种算法各有优缺点,可以根据实际情况选择使用。