📜  门| GATE-CS-2007 |第 79 题(1)

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

门 | GATE-CS-2007 | 第 79 题

这道题目出自 GATE-CS-2007 的考试中,是一道有关图的算法问题。本题目要求实现一个算法,判断一个图是否连通。以下是详细介绍:

问题描述

给定一个无向图 $G=(V,E)$,其中 $V$ 为顶点集合,$E$ 为边集合。请你实现一个算法,判断该图是否连通。如果图连通则输出 YES,否则输出 NO。

算法思路

观察题目,可以想到一种简单粗暴的解法:对于图中的每一个顶点 $v \in V$,遍历整张图,判断是否存在从 $v$ 到任意一个顶点的路径。如果每个顶点都存在一条这样的路径,说明该图是连通的。

这种方法的时间复杂度为 $\mathcal{O}(n^2)$,其中 $n = |V|$。因此,对于较大的图来说,这种算法显然效率不高。可以考虑使用更高效的算法。

一个更高效的算法是使用深度优先搜索(DFS)来判断图的连通性。我们从图中任意一个顶点开始,使用 DFS 遍历整张图。如果遍历到的所有顶点与起始顶点连通,则说明该图是连通的。

该算法的时间复杂度为 $\mathcal{O}(n+m)$,其中 $n = |V|$,$m = |E|$。因此,对于较大的图来说,该算法更为高效。

代码实现

以下代码展示了如何使用 DFS 判断一个图的连通性。输入为图的邻接矩阵。如果该图连通则输出 YES,否则输出 NO。

def isGraphConnected(graph):
    # 深度优先搜索的子函数
    def DFS(u):
        visited[u] = True
        for v in range(n):
            if graph[u][v] and not visited[v]:
                DFS(v)

    n = len(graph) # 图的顶点数
    visited = [False] * n # 用于记录每个顶点是否被访问过

    # 从第一个顶点开始进行深度优先搜索
    DFS(0)

    # 判断是否所有顶点都被访问过
    if all(visited):
        return 'YES'
    else:
        return 'NO'

以上代码通过内部定义一个名为 DFS 的子函数实现了 DFS。该函数接受一个参数 u,表示当前要访问的顶点。如果当前顶点未被访问,则将其标记为已访问,并递归遍历该点的所有邻接点。

最后,使用内建函数 all 判断是否所有顶点都被访问过。如果是,则说明该图是连通的。