





UpperCAmelCase     :     Any							=	{
    "A": ["B", "C", "E"],
    "B": ["A", "D", "E"],
    "C": ["A", "F", "G"],
    "D": ["B"],
    "E": ["A", "B", "D"],
    "F": ["C"],
    "G": ["C"],
}
def 					_A	(		SCREAMING_SNAKE_CASE					:       dict	,	SCREAMING_SNAKE_CASE					:       str	,	SCREAMING_SNAKE_CASE					:       Optional[int]						):





  """simple docstring"""



  a__     : Union[str, Any]  =set()
  # keep track of all the paths to be checked
  a__     : Optional[int]  =[[start]]

  # return path if start is goal
  if start == goal:
    return [start]

  # keeps looping until all possible paths have been checked
  while queue:
    # pop the first path from the queue
    a__     : Optional[int]  =queue.pop(0						)
    # get the last node from the path
    a__     : Any  =path[-1]
    if node not in explored:
      a__     : List[Any]  =graph[node]
      # go through all neighbour nodes, construct a new path and
      # push it into the queue
      for neighbour in neighbours:
        a__     : Union[str, Any]  =list(SCREAMING_SNAKE_CASE						)
        new_path.append(SCREAMING_SNAKE_CASE						)
        queue.append(SCREAMING_SNAKE_CASE						)
        # return path if neighbour is goal
        if neighbour == goal:
          return new_path

            # mark node as explored
      explored.add(SCREAMING_SNAKE_CASE						)

    # in case there's no path between the 2 nodes
  return []
def 					_A	(		SCREAMING_SNAKE_CASE					:       dict	,	SCREAMING_SNAKE_CASE					:       Optional[int]	,	SCREAMING_SNAKE_CASE					:       Optional[int]						):





  """simple docstring"""



  if not graph or start not in graph or target not in graph:
    return -1
  if start == target:
    return 0
  a__     : Optional[int]  =[start]
  a__     : Tuple  =set(SCREAMING_SNAKE_CASE						)
  # Keep tab on distances from `start` node.
  a__     : Optional[int]  ={start: 0, target: -1}
  while queue:
    a__     : Dict  =queue.pop(0						)
    if node == target:
      a__     : Dict  =(
          dist[node] if dist[target] == -1 else min(dist[target]	,	dist[node]						)
      )
    for adjacent in graph[node]:
      if adjacent not in visited:
        visited.add(SCREAMING_SNAKE_CASE						)
        queue.append(SCREAMING_SNAKE_CASE						)
        a__     : Optional[int]  =dist[node] + 1
  return dist[target]


if __name__ == "__main__":
     print(bfs_shortest_path(demo_graph, """G""", """D"""))  # returns ['G', 'C', 'A', 'B', 'D']
     print(bfs_shortest_path_distance(demo_graph, """G""", """D"""))  # returns 4













def 					_A	(		SCREAMING_SNAKE_CASE					:       float	,	SCREAMING_SNAKE_CASE					:       float						):





  """simple docstring"""



  return price * (1 + tax_rate)


if __name__ == "__main__":
     print(F"""{price_plus_tax(100, 0.2_5) = }""")
     print(F"""{price_plus_tax(1_2_5.5_0, 0.0_5) = }""")






