from collections import deque class UndirectedGraph: def __init__(self, num_vertices): self.num_vertices = num_vertices self.adj_list = {i: [] for i in range(num_vertices)} def add_edge(self, u, v): self.adj_list[u].append(v) self.adj_list[v].append(u) def bfs_shortest_path(self, start, end): visited = [False] * self.num_vertices distance = [-1] * self.num_vertices parent = [-1] * self.num_vertices queue = deque([start]) visited[start] = True distance[start] = 0 while queue: current_vertex = queue.popleft() for neighbor in self.adj_list[current_vertex]: if not visited[neighbor]: visited[neighbor] = True distance[neighbor] = distance[current_vertex] + 1 parent[neighbor] = current_vertex queue.append(neighbor) path = [] while end != -1: path.append(end) end = parent[end] return distance, path[::-1] undirected_graph = UndirectedGraph(6) undirected_graph.add_edge(0, 1) undirected_graph.add_edge(0, 2) undirected_graph.add_edge(1, 3) undirected_graph.add_edge(2, 4) undirected_graph.add_edge(3, 5) start_vertex = 0 end_vertex = 5 distance, shortest_path = undirected_graph.bfs_shortest_path(start_vertex, end_vertex) print(f"Shortest Distance from {start_vertex} to {end_vertex}: {distance[end_vertex]}") print(f"Shortest Path: {shortest_path}")