import collections from typing import Mapping from pygraph.graphdemo import Graph def bfs(g: Graph, start: int) -> Graph: """ :param g: :param start: :return: """ tree = Graph() queue = collections.deque() VISITED = "visited" not_visited = {VISITED: False} visited = {VISITED: True} g.for_each_vertices(lambda v : g.merge_attribute(v, not_visited)) queue.append(start) # append() is the enqueue() operation of a Queue g.merge_attribute(start, visited) while queue: u = queue.popleft() # popleft() is the dequeue() operation of a Queue for v in g.adjacent_of(u): if not g.get_attribute(v)[VISITED]: tree.add_edge(u, v) g.merge_attribute(v, visited) queue.append(v) return tree def bfs_dict(g: Graph, start: int) -> Mapping[int, int|None]: tree = {start:None} queue = collections.deque() VISITED = "visited" not_visited = {VISITED: False} visited = {VISITED: True} g.for_each_vertices(lambda v : g.merge_attribute(v, not_visited)) queue.append(start) # append() is the enqueue() operation of a Queue g.merge_attribute(start, visited) while queue: u = queue.popleft() # popleft() is the dequeue() operation of a Queue for v in g.adjacent_of(u): if not g.get_attribute(v)[VISITED]: tree[v] = u g.merge_attribute(v, visited) queue.append(v) return tree pass def find_path(g: Graph, u: int, v: int) -> list[int]: tree = bfs_dict(g, v) path = [u] while (current := path[-1]) != v: precedent = tree[current] path.append(precedent) return path def find_path_gpt(g: Graph, u: int, v: int) -> list[int]: # Erstelle einen BFS-Baum, beginnend bei Knoten v bfs_tree = bfs_dict(g, v) # Wenn u nicht in bfs_tree ist, gibt es keinen Pfad von u nach v if u not in bfs_tree: return [] # Kein Pfad gefunden # Den Pfad von u nach v rekonstruieren path = [] current = u while current is not None: path.append(current) current = bfs_tree[current] # Den Pfad umkehren, da wir rückwärts von u nach v gehen path.reverse() return path