📜  门| GATE-CS-2015(套装2)|第 45 题(1)

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

门| GATE-CS-2015(套装2)|第 45 题

这道题目是一道典型的图论问题,需要通过编程实现解决。 问题描述为给定一个有向图,判断其中是否存在环。如果存在环,则说明存在一个无限循环的情况,即计算机会一直在图中循环操作。

思路

本题可使用拓扑排序来解决。

具体实现过程如下:

  • 统计每个节点的入度,即有多少个节点指向它;
  • 找到入度为0的节点,将其放入队列中,作为拓扑排序的起点;
  • 对于队列中的每个节点,将其所有相邻节点的入度减1;
  • 如果某个节点的入度减为0,则将其加入队列,继续处理;
  • 如果所有节点都放入了队列,并完成了相邻节点的处理,但还有节点的入度不为0,则说明存在环。
代码实现
from queue import Queue

def detect_loop(graph):
    # 统计入度
    degrees = {v: 0 for v in graph}
    for vertex in graph:
        for adjacent in graph[vertex]:
            degrees[adjacent] += 1
    
    # 将入度为0的节点放入队列
    queue = Queue()
    for vertex in degrees:
        if not degrees[vertex]:
            queue.put(vertex)
    
    # 每个节点的相邻节点入度减1
    while not queue.empty():
        vertex = queue.get()
        for adjacent in graph[vertex]:
            degrees[adjacent] -= 1
            if not degrees[adjacent]:
                queue.put(adjacent)
    
    # 判断是否存在环
    for vertex in degrees:
        if degrees[vertex]:
            return True
    return False

以上代码中,graph是以字典形式存储的有向图。每个键对应节点,每个值对应以该节点为起点的所有相邻节点的列表。

函数 detect_loop 返回一个布尔值,表示有没有环。如果有环,返回 True,否则返回 False

性能分析

本算法的时间复杂度为 $O(V+E)$,其中 $V$ 是节点数, $E$ 是边数。

由于最坏情况下需要遍历整张图,所以空间复杂度为 $O(V)$。

总结

本题涉及到图论的基本知识,是一道典型的面试题目。使用拓扑排序可以有效地解决本题。在实际编程中,我们需要掌握如何使用字典和队列来表示图和处理节点。