Add Python notes
This commit is contained in:
176
python/графы/поиск в глубину.py
Executable file
176
python/графы/поиск в глубину.py
Executable file
@@ -0,0 +1,176 @@
|
||||
# Матрица смежности
|
||||
# [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)
|
||||
Reference in New Issue
Block a user