📌  相关文章
📜  检查有向图是否连通(1)

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

检查有向图是否连通

在图论中,连通性是指一个图中的任意两个节点都可以通过路径相连。本文介绍如何检查一个有向图是否连通。

深度优先搜索

深度优先搜索是一种常用的图搜索算法。通过从起点开始一直深入直到无法深入为止,然后回溯到上一个节点,继续搜索。在有向图中,经过深度优先搜索后,如果连通图中存在未被搜索到的节点,则该图不连通。

def dfs(vertex, graph, visited):
    visited[vertex] = True
    for neighbor in graph[vertex]:
        if not visited[neighbor]:
            dfs(neighbor, graph, visited)

def is_graph_connected(graph):
    n = len(graph)
    visited = [False] * n
    dfs(0, graph, visited)
    return all(visited)

代码解释:

  • dfs 函数用于从一个节点开始进行深度优先搜索,并将搜索到的节点标记为已访问。
  • is_graph_connected 函数用于判断一个有向图是否连通。它先将所有节点标记为未访问,然后从起点开始进行深度优先搜索。如果所有节点都被访问到了,则说明该图是连通的。
广度优先搜索

广度优先搜索是另一种常用的图搜索算法。它从起点开始,先将与起点相邻的节点全部加入队列中,然后逐个弹出队首节点进行搜索,直到队列为空为止。在有向图中,经过广度优先搜索后,如果连通图中存在未被搜索到的节点,则该图不连通。

from collections import deque

def bfs(vertex, graph, visited):
    q = deque([vertex])
    visited[vertex] = True
    while q:
        cur = q.popleft()
        for neighbor in graph[cur]:
            if not visited[neighbor]:
                q.append(neighbor)
                visited[neighbor] = True

def is_graph_connected(graph):
    n = len(graph)
    visited = [False] * n
    bfs(0, graph, visited)
    return all(visited)

代码解释:

  • bfs 函数用于从一个节点开始进行广度优先搜索,并将搜索到的节点标记为已访问。使用了 Python 中的双向队列 deque
  • is_graph_connected 函数用于判断一个有向图是否连通。它先将所有节点标记为未访问,然后从起点开始进行广度优先搜索。如果所有节点都被访问到了,则说明该图是连通的。
总结

本文介绍了两种判断有向图连通性的算法:深度优先搜索和广度优先搜索。它们在原理上有所不同,但本质上都是通过遍历图中的节点,判断是否能够访问到所有的节点来判断图的连通性。