📜  门| GATE-CS-2016(Set 2)|问题22(1)

📅  最后修改于: 2023-12-03 14:58:31.117000             🧑  作者: Mango

门| GATE-CS-2016(Set 2)|问题22

该问题主要涉及到有向图中环的检测。 环是指沿着有向路径可以回到原始节点的路径。

给定有向图的邻接列表表示,需要检查其是否有环存在。

解题思路

一种检测图中环的方法是使用深度优先搜索(DFS)。将每个节点标记为未访问、正在访问、已访问。对于每个未访问的节点,遍历其邻居。如果邻居已经被标记为正在访问,则存在环。如果邻居已经被标记为已访问,则跳过。如果没有找到环,则将该节点标记为已访问。

以下是该算法的python实现:

def has_cycle(adj_list):
    visited = [False] * len(adj_list)
    stack = [False] * len(adj_list)
    
    def dfs(node):
        visited[node] = True
        stack[node] = True
        
        for neighbor in adj_list[node]:
            if not visited[neighbor]:
                if dfs(neighbor):
                    return True
            elif stack[neighbor]:
                return True
        
        stack[node] = False
        return False
    
    for node in range(len(adj_list)):
        if not visited[node]:
            if dfs(node):
                return True
    
    return False
复杂度分析

该算法使用DFS遍历整个图,每个节点都会被访问一次,每次遍历的时间复杂度为O(V+E),其中V为节点数,E为边数。总时间复杂度为O(V+E)。

总结

通过使用DFS来检测有向图中的环,可以快速而有效地找出环的存在。复杂度也比较优秀,非常适合一些小型有向图的检测。