Files
learning/python/графы/поиск в глубину.py
2022-05-06 00:49:26 +03:00

177 lines
4.8 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Матрица смежности
# [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)