📅  最后修改于: 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两种算法解决无向图中是否存在路径的问题的代码片段。这两种算法各有优缺点,可以根据实际情况选择使用。