code: def is_connected(self):
          r
          if self._connected is not None:
              return self._connected
  
          adjacencies = [self.W]
          if self.is_directed():
              adjacencies.append(self.W.T)
  
          for adjacency in adjacencies:
              visited = np.zeros(self.n_vertices, dtype=np.bool)
              stack = set([0])
  
              while stack:
                  vertex = stack.pop()
  
                  if visited[vertex]:
                      continue
                  visited[vertex] = True
  
                  neighbors = adjacency[vertex].nonzero()[1]
                  stack.update(neighbors)
  
              if not np.all(visited):
                  self._connected = False
                  return self._connected
  
          self._connected = True
          return self._connected
docs: r"""Check if the graph is connected (cached).
  
          A graph is connected if and only if there exists a (directed) path
          between any two vertices.
  
          Returns
          -------
          connected : bool
              True if the graph is connected, False otherwise.
  
          Notes
          -----
  
          For undirected graphs, starting at a vertex and trying to visit all the
          others is enough.
          For directed graphs, one needs to check that a vertex can both be
          visited by all the others and visit all the others.
  
          Examples
          --------
  
          Connected graph:
  
          >>> graph = graphs.Graph([
          ...     [0, 3, 0, 0],
          ...     [3, 0, 4, 0],
          ...     [0, 4, 0, 2],
          ...     [0, 0, 2, 0],
          ... ])
          >>> graph.is_connected()
          True
  
          Disconnected graph:
  
          >>> graph = graphs.Graph([
          ...     [0, 3, 0, 0],
          ...     [3, 0, 4, 0],
          ...     [0, 0, 0, 2],
          ...     [0, 0, 2, 0],
          ... ])
          >>> graph.is_connected()
          False