(graph)
return []
Find a cycle in the given graph.
    
    This function will return a list of nodes which form a cycle in the graph or an empty list if
    no cycle exists.
    
    @type graph: graph, digraph
    @param graph: Graph.
    
    @rtype: list
    @return: List of nodes.
Find a cycle in the given graph.
    
    This function will return a list of nodes which form a cycle in the graph or an empty list if
    no cycle exists.
Find a cycle in the given graph . This function will return a list of nodes which form a cycle in the graph or an empty list if no cycle exists .
def find_cycle(graph):
    """
    Find a cycle in the given graph.
    
    This function will return a list of nodes which form a cycle in the graph or an empty list if
    no cycle exists.
    
    @type graph: graph, digraph
    @param graph: Graph.
    
    @rtype: list
    @return: List of nodes. 
    """
    
    if (isinstance(graph, graph_class)):
        directed = False
    elif (isinstance(graph, digraph_class)):
        directed = True
    else:
        raise InvalidGraphType

    def find_cycle_to_ancestor(node, ancestor):
        """
        Find a cycle containing both node and ancestor.
        """
        path = []
        while (node != ancestor):
            if (node is None):
                return []
            path.append(node)
            node = spanning_tree[node]
        path.append(node)
        path.reverse()
        return path
    
    def dfs(node):
        """
        Depth-first search subfunction.
        """
        visited[node] = 1
        # Explore recursively the connected component
        for each in graph[node]:
            if (cycle):
                return
            if (each not in visited):
                spanning_tree[each] = node
                dfs(each)
            else:
                if (directed or spanning_tree[node] != each):
                    cycle.extend(find_cycle_to_ancestor(node, each))

    recursionlimit = getrecursionlimit()
    setrecursionlimit(max(len(graph.nodes())*2,recursionlimit))

    visited = {}              # List for marking visited and non-visited nodes
    spanning_tree = {}        # Spanning tree
    cycle = []

    # Algorithm outer-loop
    for each in graph:
        # Select a non-visited node
        if (each not in visited):
            spanning_tree[each] = None
            # Explore node's connected component
            dfs(each)
            if (cycle):
                setrecursionlimit(recursionlimit)
                return cycle

    setrecursionlimit(recursionlimit)
    return []
def find_cycle ( graph ) : if ( isinstance ( graph , graph_class ) ) : directed = False elif ( isinstance ( graph , digraph_class ) ) : directed = True else : raise InvalidGraphType def find_cycle_to_ancestor ( node , ancestor ) : """
        Find a cycle containing both node and ancestor.
        """ path = [ ] while ( node != ancestor ) : if ( node is None ) : return [ ] path . append ( node ) node = spanning_tree [ node ] path . append ( node ) path . reverse ( ) return path def dfs ( node ) : """
        Depth-first search subfunction.
        """ visited [ node ] = 1 # Explore recursively the connected component for each in graph [ node ] : if ( cycle ) : return if ( each not in visited ) : spanning_tree [ each ] = node dfs ( each ) else : if ( directed or spanning_tree [ node ] != each ) : cycle . extend ( find_cycle_to_ancestor ( node , each ) ) recursionlimit = getrecursionlimit ( ) setrecursionlimit ( max ( len ( graph . nodes ( ) ) * 2 , recursionlimit ) ) visited = { } # List for marking visited and non-visited nodes spanning_tree = { } # Spanning tree cycle = [ ] # Algorithm outer-loop for each in graph : # Select a non-visited node if ( each not in visited ) : spanning_tree [ each ] = None # Explore node's connected component dfs ( each ) if ( cycle ) : setrecursionlimit ( recursionlimit ) return cycle setrecursionlimit ( recursionlimit ) return [ ]