📜  打印所有不可达节点的程序|使用 BFS(1)

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

打印所有不可达节点的程序 | 使用 BFS

本程序使用广度优先算法(BFS)来查找所有不可达节点。

算法原理

BFS 适用于图的遍历,其基本原理是:从起始节点开始,以层级的形式逐层遍历与之相邻的节点,直到找到目标节点为止。通过BFS我们可以找到起始节点到其他所有节点的最短路径。

但这里我们并不关心最短路径,而是要找到所有不可达节点,因此需要稍作修改。具体步骤如下:

  1. 创建一个 visited 集合,用于储存已经遍历过的节点。
  2. 创建一个 queue 队列,用于存储将要遍历的节点。
  3. 将起始节点加入队列。
  4. 循环取出队列中的节点并遍历它的所有相邻节点。
  5. 如果相邻节点未被遍历过,则将其加入 visited 集合并加入队列。
  6. 直到队列为空时,中止遍历。此时,visited 集合中的节点即为所有可达节点,未出现在 visited 集合中的节点即为不可达节点。
代码实现

下面是用 Python 语言实现的示例代码:

def BFS(graph, start):
    visited, queue = set(), [start]  # 将起始节点加入队列
    visited.add(start)  # 将起始节点加入 visited 集合
    while queue:  # 队列不为空时循环取出节点进行遍历
        vertex = queue.pop(0)   # 取出队列头的节点
        for neighbor in graph[vertex]:  # 遍历相邻节点
            if neighbor not in visited:  # 如果相邻节点未被遍历过
                visited.add(neighbor)  # 将其加入 visited 集合
                queue.append(neighbor)  # 将其加入队列
    return visited

graph = {  # 一个简单的无向图,共有7个节点
    'A': set(['B', 'C']),
    'B': set(['A', 'D', 'E']),
    'C': set(['A', 'F']),
    'D': set(['B']),
    'E': set(['B', 'F']),
    'F': set(['C', 'E']),
    'G': set(['H']),
    'H': set(['G'])
}

reachable_nodes = BFS(graph, 'A')  # 查找节点A可达的节点

unreachable_nodes = set(graph.keys()) - reachable_nodes  # 找到不可达节点

print("不可达节点:", unreachable_nodes)

代码输出结果包括所有不可达节点:

不可达节点: {'G', 'H'}
总结

本程序使用 BFS 算法找到所有可达节点,然后从图中取出所有节点,减去可达节点,即为不可达节点。如果图不连通,则需要对每个节点都进行一遍 BFS 遍历。