Графы для школьников: вершины, ребра и поиск пути
Автор: Казачкин Даниил Михайлович · Обновлено
Вершины могут обозначать города, страницы сайта, клетки поля, людей или состояния задачи. Ребра показывают связи: дорогу, переход, дружбу, возможный ход.
Граф состоит из вершин и ребер. Вершины могут обозначать города, страницы сайта, клетки поля, людей или состояния задачи. Ребра показывают связи: дорогу, переход, дружбу, возможный ход.
Графы помогают решать задачи на маршруты, достижимость, кратчайшие пути и связи между объектами.
Как хранить граф
Один из удобных способов — словарь списков. Ключ — вершина, значение — список соседей.
graph = {
'A': ['B', 'C'],
'B': ['A', 'D'],
'C': ['A'],
'D': ['B'],
}
for vertex, neighbours in graph.items():
print(vertex, '->', neighbours)Такой формат называется списком смежности.
Поиск в ширину
Чтобы найти, достижима ли одна вершина из другой, используют очередь.
start = 'A'
target = 'D'
queue = [start]
visited = {start}
while queue:
vertex = queue.pop(0)
if vertex == target:
print('путь есть')
break
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
else:
print('пути нет')Поиск в ширину сначала проверяет ближайшие вершины, потом более дальние.
Где встречаются графы
Графы появляются в олимпиадах, задачах на лабиринты, маршруты по городам, переходы между состояниями и анализ сетей. Даже если слово “граф” в условии не написано, связи между объектами часто удобно представить именно так.
Для школьника главное — научиться переводить условие в вершины и ребра. После этого задача становится понятнее: нужно найти путь, количество связей, компоненту или кратчайшее расстояние.
Практикум: маршрут между кабинетами
Представьте школьные кабинеты вершинами, а прямые переходы — рёбрами. Для связей A–B, A–C, B–D, C–D, D–E составьте список смежности и найдите кратчайший по числу переходов путь из A в E поиском в ширину. На каждом слое записывайте очередь и множество посещённых вершин. Проверьте путь из вершины в себя и отдельный несвязанный кабинет F. Храните предка каждой вершины, чтобы восстановить маршрут, а не только сообщить факт достижимости.
Контрольная точка
Почему вершину отмечают посещённой при добавлении в очередь, а не после извлечения? Покажите на вершине D, как поздняя отметка допускает несколько одинаковых записей и усложняет восстановление пути.
Частые вопросы
Когда граф должен быть ориентированным?
Если связь действует только в одну сторону — односторонняя дорога, ссылка или команда перехода, — ребро ориентированное. Обычный двусторонний коридор задаёт два направления либо одно неориентированное ребро.
Связанные исследования
- Raft: выбор лидера и репликация лога на понятном примере — Пошаговый разбор Raft: terms, выбор лидера, AppendEntries, commitIndex, кворум из пяти серверов и реальные границы гарантий.
Источники
- Босова Л.Л. Информатика. Базовый курс: учебник для 7-9 классов. - М.: БИНОМ. Лаборатория знаний.
- Поляков К.Ю., Еремин Е.А. Информатика. 10-11 классы. Углубленный уровень.
- Python Documentation: The Python Tutorial.