ó
ú£Õ\c           @   sŽ   d  Z  d d l Z d j d d d g ƒ Z d d d	 d
 d d d g Z d „  Z d d „ Z d „  Z	 d „  Z
 d „  Z d „  Z d d „ Z d S(   s    
Strongly connected components.
iÿÿÿÿNs   
s
   Eben Kenahs2   Aric Hagberg (hagberg@lanl.gov)Christopher Ellisons!   Ben Edwards (bedwards@cs.unm.edu)t$   number_strongly_connected_componentst   strongly_connected_componentst&   strongly_connected_component_subgraphst   is_strongly_connectedt'   strongly_connected_components_recursivet&   kosaraju_strongly_connected_componentst   condensationc         C   s  i  } i  } i  } g  } g  } d } xÊ|  D]Â} | | k r+ | g } x¤| ré| d }	 |	 | k r| | d } | | |	 <n  d }
 |  |	 } x1 | D]) } | | k r“ | j  | ƒ d }
 Pq“ q“ W|
 d k rI | |	 | |	 <xp | D]h } | | k rá | | | |	 k r(t | |	 | | g ƒ | |	 <qIt | |	 | | g ƒ | |	 <qá qá W| j ƒ  | |	 | |	 k rÖt | |	 <|	 g } xE | rÅ| | d | |	 k rÅ| j ƒ  } t | | <| j  | ƒ qW| j  | ƒ qæ| j  |	 ƒ qI qI Wq+ q+ W| j d t d t ƒ | S(   s/  Return nodes in strongly connected components of graph.

    Parameters
    ----------
    G : NetworkX Graph
       An directed graph.

    Returns
    -------
    comp : list of lists
       A list of nodes for each component of G.
       The list is ordered from largest connected component to smallest.

    See Also
    --------
    connected_components

    Notes
    -----
    Uses Tarjan's algorithm with Nuutila's modifications.
    Nonrecursive version of algorithm.

    References
    ----------
    .. [1] Depth-first search and linear graph algorithms, R. Tarjan
       SIAM Journal of Computing 1(2):146-160, (1972).

    .. [2] On finding the strongly connected components in a directed graph.
       E. Nuutila and E. Soisalon-Soinen
       Information Processing Letters 49(1): 9-14, (1994)..
    i    iÿÿÿÿi   t   keyt   reverse(   t   appendt   mint   popt   Truet   sortt   len(   t   Gt   preordert   lowlinkt	   scc_foundt	   scc_queuet   scc_listt   it   sourcet   queuet   vt   donet   v_nbrst   wt   scct   k(    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR      sP     		


!%

	!
c   
      C   sú   g  } |  j  d t ƒ }  t t j |  d | ƒƒ } |  j  d t ƒ }  i  } x’ | rß | j ƒ  } | | k rr qN n  t j |  | ƒ } g  | D] } | | k r‹ | ^ q‹ } | j g  | D] }	 |	 t f ^ q¶ ƒ | j	 | ƒ qN W| j
 d t d t ƒ | S(   sŸ  Return nodes in strongly connected components of graph.

    Parameters
    ----------
    G : NetworkX Graph
       An directed graph.

    Returns
    -------
    comp : list of lists
       A list of nodes for each component of G.
       The list is ordered from largest connected component to smallest.

    See Also
    --------
    connected_components

    Notes
    -----
    Uses Kosaraju's algorithm.
    t   copyR   R   R   (   R   t   Falset   listt   nxt   dfs_postorder_nodesR   t   dfs_preorder_nodest   updateR   R	   R   R   (
   R   R   t
   componentst   postt   seent   rt   cR   t   newt   u(    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR   e   s    	%&c            sŒ   ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  ‰ g  ‰ i  ‰ i  ‰ i  ‰ d } g  ‰ x* ˆ  D]" } | ˆ k rL ˆ | | ƒ qL qL Wˆ j  d t d t ƒ ˆ S(   s-  Return nodes in strongly connected components of graph.

    Recursive version of algorithm.

    Parameters
    ----------
    G : NetworkX Graph
       An directed graph.

    Returns
    -------
    comp : list of lists
       A list of nodes for each component of G.
       The list is ordered from largest connected component to smallest.

    See Also
    --------
    connected_components

    Notes
    -----
    Uses Tarjan's algorithm with Nuutila's modifications.

    References
    ----------
    .. [1] Depth-first search and linear graph algorithms, R. Tarjan
       SIAM Journal of Computing 1(2):146-160, (1972).

    .. [2] On finding the strongly connected components in a directed graph.
       E. Nuutila and E. Soisalon-Soinen
       Information Processing Letters 49(1): 9-14, (1994)..
    c            s  | ˆ |  <| ˆ |  <| d 7} ˆ j  |  ƒ xX ˆ  |  D]L } | ˆ k rX ˆ | | ƒ n  | ˆ k r6 t ˆ |  ˆ | ƒ ˆ |  <q6 q6 Wˆ |  ˆ |  k rˆ |  ˆ |  <|  g } x; ˆ d |  k rî ˆ j ƒ  } ˆ |  ˆ | <| j  | ƒ q´ Wˆ j |  ƒ ˆ j  | ƒ n  d  S(   Ni   iÿÿÿÿ(   R	   R
   R   t   remove(   R   t   cntR   t   tmpc(   R   t	   componentt   rootR   t   stackt   visitt   visited(    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR2   ­   s$    


 "	i    R   R   (   R   R   R   (   R   R-   R   (    (   R   R/   R0   R   R1   R2   R3   si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR   Œ   s    !!c         C   sC   t  |  ƒ } g  } x* | D]" } | j |  j | ƒ j ƒ  ƒ q W| S(   sÓ  Return strongly connected components as subgraphs.

    Parameters
    ----------
    G : NetworkX Graph
       A graph.

    Returns
    -------
    glist : list
      A list of graphs, one for each strongly connected component of G.

    See Also
    --------
    connected_component_subgraphs

    Notes
    -----
    The list is ordered from largest strongly connected component to smallest.

    Graph, node, and edge attributes are copied to the subgraphs.
    (   R   R	   t   subgraphR   (   R   t   cct
   graph_listR)   (    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR   Í   s
     c         C   s   t  t |  ƒ ƒ S(   sK  Return number of strongly connected components in graph.

    Parameters
    ----------
    G : NetworkX graph
       A directed graph.

    Returns
    -------
    n : integer
       Number of strongly connected components

    See Also
    --------
    connected_components

    Notes
    -----
    For directed graphs only.
    (   R   R   (   R   (    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR    ë   s    c         C   sb   |  j  ƒ  s t j d ƒ ‚ n  t |  ƒ d k rB t j d ƒ ‚ n  t t |  ƒ d ƒ t |  ƒ k S(   s^  Test directed graph for strong connectivity.

    Parameters
    ----------
    G : NetworkX Graph
       A directed graph.

    Returns
    -------
    connected : bool
      True if the graph is strongly connected, False otherwise.

    See Also
    --------
    strongly_connected_components

    Notes
    -----
    For directed graphs only.
    s[   Not allowed for undirected graph G.
              See is_connected() for connectivity test.i    s-   Connectivity is undefined for the null graph.(   t   is_directedR!   t   NetworkXErrorR   t   NetworkXPointlessConceptR   (   R   (    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR     s    c   	      C   sÑ   | d k r t j |  ƒ } n  i  } t j ƒ  } x5 t | ƒ D]' \ } } x | D] } | | | <qP Wq= W| j t t | ƒ ƒ ƒ xI |  j ƒ  D]; \ } } | | | | k rŽ | j	 | | | | ƒ qŽ qŽ W| S(   sV  Returns the condensation of G.

    The condensation of G is the graph with each of the strongly connected
    components contracted into a single node.

    Parameters
    ----------
    G : NetworkX DiGraph
       A directed graph.

    scc:  list (optional, default=None)
       A list of strongly connected components.  If provided, the elements in
       `scc` must partition the nodes in `G`. If not provided, it will be
       calculated as scc=nx.strongly_connected_components(G).

    Returns
    -------
    C : NetworkX DiGraph
       The condensation of G. The node labels are integers corresponding
       to the index of the component in the list of strongly connected
       components.

    Notes
    -----
    After contracting all strongly connected components to a single node,
    the resulting graph is a directed acyclic graph.
    N(
   t   NoneR!   R   t   DiGrapht	   enumeratet   add_nodes_fromt   rangeR   t   edgest   add_edge(	   R   R   t   mappingt   CR   R/   t   nR+   R   (    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyR   "  s    (   t   __doc__t   networkxR!   t   joint   __authors__t   __all__R   R:   R   R   R   R    R   R   (    (    (    si   /Users/dxp/prism/prism-games/prism-examples/smgs/car/networkx/algorithms/components/strongly_connected.pyt   <module>   s$   			L'	A			