# Матрица смежности # [y][x] - существование пути (ребра) из y в x (опционально - вместо существования bool вес int) # При нумерации с 1 при этом методе существует несоответствие номеров узлов и индексов (индекс = номер - 1) graph = ( (0, 1, 1, 0, 0, 0, 1), (1, 0, 1, 1, 0, 0, 0), (1, 1, 0, 0, 0, 0, 0), (0, 1, 0, 0, 1, 0, 0), (0, 0, 0, 1, 0, 1, 0), (0, 0, 0, 0, 1, 0, 1), (1, 0, 0, 0, 0, 1, 0) ) # Поиск в глубину visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена queue = [] # Список узлов, которые нужно посетить queue.append(0) # Стартовый узел while len(queue): # Пока есть узлы, которые надо посетить node1 = queue.pop(-1) visited_nodes[node1] = 2 for node2 in range(6, -1, -1): # С последнего к первому. от 6 до 0 включительно if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен queue.append(node2) visited_nodes[node2] = 1 # Поиск первого пути в невзвешенном графе (из точки 3 в 5) class Edge: def __init__(self, begin, end): self.begin = begin self.end = end def __str__(self): return f"Edge({self.begin + 1}, {self.end + 1})" def find_edges(graph, starting_point, stopping_point): visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена edges = [] queue = [] # Список узлов, которые нужно посетить queue.append(starting_point) # Стартовый узел while len(queue): # Пока есть узлы, которые надо посетить node1 = queue.pop(-1) visited_nodes[node1] = 2 print('Checking node %s' % node1) for node2 in range(6, -1, -1): print(f'Checking path to {node2}') if graph[node1][node2] == 1 and visited_nodes[node2] == 0: # Узел смежный и не обнаружен print('Path exists and is undetected. Saving') queue.append(node2) visited_nodes[node2] = 1 edges.append(Edge(node1, node2)) if node2 == stopping_point: print('Found stop, returning') return edges return edges start = 2 req = 4 edges = find_edges(graph, start, req) print('\nResulting list: ') for i in edges: print(i) print("\nPath:") while len(edges): edge = edges.pop(-1) if edge.end == req: req = edge.begin print(edge) # ================================================================== # Список смежности # ключ - номер узла, значение - список узлов, с которыми есть связь print('\n\n\n\n\n\nСписок смежности') graph = { 1: (2, 3, 7), 2: (1, 3, 4), 3: (1, 2), 4: (2, 5), 5: (4, 6), 6: (5, 7), 7: (1, 6) } # Поиск в глубину visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена queue = [] queue.append(1) while len(queue): node1 = queue.pop(-1) visited_nodes[node1 - 1] = 2 for node2 in graph.get(node1)[::-1]: # Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы. if visited_nodes[node2 - 1] == 0: visited_nodes[node2 - 1] = 1 queue.append(node2) # Поиск первого пути в невзвешенном графе (из точки 3 в 5) class Edge: def __init__(self, begin, end): self.begin = begin self.end = end def __str__(self): return f"Edge({self.begin}, {self.end})" def find_edges(graph, starting_point, stopping_point): visited_nodes = [0, 0, 0, 0, 0, 0, 0] # 1 - обнаружена, 2 - посещена queue = [] queue.append(starting_point) edges = [] while len(queue): node1 = queue.pop(-1) visited_nodes[node1 - 1] = 2 print(f'Checking node {node1}') for node2 in graph.get(node1)[::-1]: print(f'Checking existing path to {node2}') # Проверка на смежность в этом методе не нужна, потому что в списке уже содержатся смежные узлы. if visited_nodes[node2 - 1] == 0: print('Path is undetected. Saving') visited_nodes[node2 - 1] = 1 queue.append(node2) edges.append(Edge(node1, node2)) if node2 == stopping_point: print('Found stop, returning') return edges return edges start = 3 req = 5 edges = find_edges(graph, start, req) print('\nResulting list: ') for i in edges: print(i) print("\nPath:") while len(edges): edge = edges.pop(-1) if edge.end == req: req = edge.begin print(edge)