




# A Bipartite Graph is a graph whose vertices can be divided into two independent sets,
# U and V such that every edge (u, v) either connects a vertex from U to V or a vertex
# from V to U. In other words, for every edge (u, v), either u belongs to U and v to V,
# or u belongs to V and v to U. We can also say that there is no edge that connects
# vertices of same set.
from queue import Queue
def 		a_       (   __lowerCAmelCase							):
  lowerCAmelCase__								=			Queue()
  lowerCAmelCase__								=			[False] * len(__lowerCAmelCase							)
  lowerCAmelCase__								=			[-1] * len(__lowerCAmelCase							)

  def bfs():
    while not queue.empty():
      lowerCAmelCase__								=			queue.get()
      lowerCAmelCase__								=			True

      for neighbour in graph[u]:
        if neighbour == u:
          return False

        if color[neighbour] == -1:
          lowerCAmelCase__								=			1 - color[u]
          queue.put(__lowerCAmelCase							)

        elif color[neighbour] == color[u]:
          return False

    return True

  for i in range(len(__lowerCAmelCase							)							):
    if not visited[i]:
      queue.put(__lowerCAmelCase							)
      lowerCAmelCase__								=			0
      if bfs() is False:
        return False

  return True


if __name__ == "__main__":
      # Adjacency List of graph
      print(check_bipartite({0: [1, 3], 1: [0, 2], 2: [1, 3], 3: [0, 2]}))







def 		a_       (   __lowerCAmelCase      ,   __lowerCAmelCase							):
  assert isinstance(__lowerCAmelCase      ,   __lowerCAmelCase							), F"""The input value of [set_a={set_a}] is not a set"""
  assert isinstance(__lowerCAmelCase      ,   __lowerCAmelCase							), F"""The input value of [set_b={set_b}] is not a set"""

  return {a + b for a in set_a for b in set_b}


if __name__ == "__main__":
      from doctest import testmod

      testmod()

