📜  算法|图遍历|问题12(1)

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

图遍历算法介绍及问题12解法

图遍历是指遍历图中所有节点的过程,常用的图遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS)。

深度优先搜索(DFS)

深度优先搜索(DFS)是一种递归遍历的算法,从某个顶点开始,遍历其所有邻接顶点,直到结束,再回溯到前一个顶点,继续遍历其它邻接顶点。其基本实现原理为在每个节点递归访问其所有未曾访问过的邻居节点。

DFS算法步骤
  1. 从起点开始沿着一条边往下走,直到无法继续下去为止。

  2. 如果当前节点有未被访问过的邻居节点,则选择一个未被访问的邻居节点作为下一个要访问的节点,否则往回走到前一个节点继续遍历。

  3. 重复1、2两个步骤,直到所有节点都被访问过为止。

DFS代码例子
visited = set()

def dfs(graph, node):
    if node not in visited:
        visited.add(node)
        for neighbor in graph[node]:
            dfs(graph, neighbor)
广度优先搜索(BFS)

广度优先搜索(BFS)是一种逐层遍历的算法,从某个顶点开始,依次遍历每一层的所有节点,直到遍历到目标节点为止。其基本实现原理为在访问的同时,维护一个队列,用于记录所有待访问的节点。

BFS算法步骤
  1. 将起点加入队列;

  2. 从队首取出一个节点,访问它的邻居节点,并将邻居节点加入队列;

  3. 重复2步骤,直到队列为空或者找到目标节点为止。

BFS代码例子
from collections import deque

def bfs(graph, start, end):
    queue = deque()
    queue.append(start)
    visited = set()
    visited.add(start)

    while queue:
        node = queue.popleft()
        if node == end:
            return True

        for neighbor in graph[node]:
            if neighbor not in visited:
                visited.add(neighbor)
                queue.append(neighbor)
    return False
问题12解法

问题12要求判断一个有向图是否存在环。可以使用DFS算法进行解决,在遍历的过程中,记录访问记录和递归栈,如果某一个节点被访问过,并且在递归栈中存在,则类推可以得到存在环。

问题12解法代码例子
def hasCycle(graph):
    def dfs(node, visited, stack):
        visited.add(node)
        stack.add(node)

        for neighbor in graph[node]:
            if neighbor not in visited:
                if dfs(neighbor, visited, stack):
                    return True
            elif neighbor in stack:
                return True

        stack.remove(node)
        return False

    visited = set()
    stack = set()
    for node in graph.keys():
        if node not in visited:
            if dfs(node, visited, stack):
                return True
    return False

以上就是关于图遍历算法以及问题12的介绍及解法。