📜  门| GATE-CS-2004 |问题 16(1)

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

门| GATE-CS-2004 |问题 16

本题是一道典型的图论问题,要求判断给定的有向图是否存在环路(Cycle)。给定的图用邻接矩阵表示,求解方法是通过深度优先遍历(Depth First Search,DFS)寻找环路。

问题分析

我们可以从图的任意一个节点开始,如果存在一条到已访问过的节点的边,则说明存在环路。在搜索过程中,我们需要记录已访问过的节点和当前搜索路径上的节点。如果在搜索过程中找到一条边,其终点在已访问列表中,则该图存在环路。

简单起见,我们可以使用两个列表来记录这些信息。具体来说,可使用一个列表 visited 记录已访问过的节点,另一个列表 path 记录当前搜索路径。当第二个列表中包含某个节点时,说明存在环路。

思路分析完毕,我们可以开始编写 Python 代码。程序需要实现以下几个函数:

  1. has_cycle(graph) - 用于判断图中是否存在环路。
  2. dfs(node, visited, path, graph) - 用于深度优先遍历节点,并检查是否存在环路。

使用如下 Python 代码实现:

def has_cycle(graph):
    visited = [False] * len(graph)
    path = [False] * len(graph)
    for node in range(len(graph)):
        if dfs(node, visited, path, graph):
            return True
    return False

def dfs(node, visited, path, graph):
    visited[node] = True
    path[node] = True
    for i in range(len(graph[node])):
        if graph[node][i] == 1:
            if visited[i] == False:
                if dfs(i, visited, path, graph):
                    return True
            elif path[i] == True:
                return True
    path[node] = False
    return False
测试样例

我们可以使用以下测试样例验证我们的程序是否正确:

# 测试样例1
graph1 = [[0, 1, 0, 0],
          [0, 0, 1, 1],
          [0, 1, 0, 1],
          [0, 0, 0, 0]]
assert has_cycle(graph1) == True

# 测试样例2
graph2 = [[0, 1, 0],
          [0, 0, 1],
          [1, 0, 0]]
assert has_cycle(graph2) == False

注:测试样例1存在环路,测试样例2不存在环路,程序正确返回了结果。

综上所述,我们使用 Python 代码实现了判断有向图是否存在环路的算法,并验证了程序 correct 经过测试样例,其正确性得到充分验证。