code: def __dfs(self, v, index, layers):
          
          if index == 0:
              path = [v]
              while self._dfs_parent[v] != v:
                  path.append(self._dfs_parent[v])
                  v = self._dfs_parent[v]
              self._dfs_paths.append(path)
              return True
          for neighbour in self._graph[v]:  # check the neighbours of vertex
              if neighbour in layers[index - 1]:
                  # if neighbour is in left, we are traversing unmatched edges..
                  if neighbour in self._dfs_parent:
                      continue
                  if (neighbour in self._left and (v not in self._matching or neighbour != self._matching[v])) or \
                          (neighbour in self._right and (v in self._matching and neighbour == self._matching[v])):
                      self._dfs_parent[neighbour] = v
                      if self.__dfs(neighbour, index-1, layers):
                          return True
          return False
docs: we recursively run dfs on each vertices in free_vertex,
  
          :param v: vertices in free_vertex
          :return: True if P is not empty (i.e., the maximal set of vertex-disjoint alternating path of length k)
          and false otherwise.