<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def is_connected(T, directed=True):
 r"""Check connectivity of the given matrix. Parameters T : (M, M) ndarray or scipy.sparse matrix Matrix to check directed : bool (optional) If True respect direction of transitions, if False do not distinguish between forward and backward transitions Returns ------- is_connected : bool True, if T is connected, False otherwise Notes ----- A transition matrix :math:`T=(t_{ij})` is connected if for any pair of states :math:`(i, j)` one can reach state :math:`j` from state :math:`i` in a finite number of steps. In more precise terms: For any pair of states :math:`(i, j)` there exists a number :math:`N=N(i, j)`, so that the probability of going from state :math:`i` to state :math:`j` in :math:`N` steps is positive, :math:`\mathbb{P}(X_{N}=j|X_{0}=i)>0`. A transition matrix with this property is also called irreducible. Viewing the transition matrix as the adjency matrix of a (directed) graph the transition matrix is irreducible if and only if the corresponding graph has a single connected component. Connectivity of a graph can be efficiently checked using Tarjan's algorithm. References .. [1] Hoel, P G and S C Port and C J Stone. 1972. Introduction to Stochastic Processes. .. [2] Tarjan, R E. 1972. Depth-first search and linear graph algorithms. SIAM Journal on Computing 1 (2):
 146-160. Examples -------- False True """

    T = _types.ensure_ndarray_or_sparse(T, ndim=2, uniform=True, kind='numeric')
    if _issparse(T):
        return sparse.assessment.is_connected(T, directed=directed)
    else:
        T = _csr_matrix(T)
        return sparse.assessment.is_connected(T, directed=directed)