Лабораторная работа № 9. Алгоритмы обработки графов
Теоретическая часть
Матрица смежности
Элемент \(M[i,j]=1\), если \((i,j)\) является ребром графа \(G\) и \(M[i,j]=0\) в противоположном случае:
Абстрактный тип данных Graph
Класс Graph будет храниться в файле ds.py. Чтобы создать новый объект класса Graph необходимо импортировать класс из файла ds.py:
# импорт класса Graph из файла ds.py
from ds import Graph
# создание нового объекта класса Graph
# в скобках - максимальное количество вершин в графе
g = Graph(5)В Таблице 1 перечислены методы класса Graph.
Graph
| Метод | Назначение | Пример |
|---|---|---|
add_edge(v, w) |
Делает вершины vи w смежными. |
g.add_edge(1, 2) |
del_edge(v, w) |
Удаляет ребро между вершинами v и w. |
g.del_edge(1, 2; |
has_edge(v, w) |
Проверяет, являются ли смежными вершины v и w. Возвращает логическое значение |
b = g.has_edge(0, 1) |
set_value(v, st) |
Сохраняет строку st в вершине v. |
g.set_value(0, 'V') |
get_value(v) |
Возвращает значение, сохранённое в вершине v. Вернёт пустую строку, если значение до этого не сохранялось. |
val = g.get_value(0) |
neighbors(v) |
Возвращает список вершин смежных с вершиной v. |
lst = g.neighbors(1) |
abj() |
Выводит на экран матрицу смежности графа и возвращает её. | g.abj() |
Рассмотрим изображение графа:
Представим данный граф с помощью типа данных Graph. Также выведем на экран список вершин смежных с вершиной 2 и результат проверки на смежность двух пар вершин:
# импорт класса Graph из модуля ds
from ds import Graph
g = Graph(4) # создаём объект типа Graph с 4 вершинами
g.add_edge(0, 1) # добавляем ребро между вершинами 0 и 1
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 3)
# список вершин, смежных с вершиной 2
print(g.neighbors(2)) # -> [0, 1, 3]
# смежны ли вершины 2 и 1 ?
print(g.has_edge(2, 1)) # -> True
# смежны ли вершины 1 и 3 ?
print(g.has_edge(1, 3)) # -> FalseВыполнение кода проиллюстрировано на следующем изображении:
Обход графа в глубину
- Начинаем обход с выбранной вершины, помечаем её как посещённую и рекурсивно переходим к непосещённым соседям.
- При каждом переходе углубляемся до тех пор, пока не достигнем вершины без не посещённых соседей.
- После завершения пути возвращаемся назад по стеку вызовов, продолжая обход с других не посещённых вершин.
Обход графа в ширину
- Начинаем обход с выбранной вершины, добавляя её в очередь и помечая как посещённую.
- Извлекаем вершину из очереди, посещаем всех её не посещённых соседей и добавляем их в очередь.
- Повторяем процесс, пока очередь не станет пустой, обходя граф в ширину.
Для реализации данного алгоритма понадобится абстрактный тип данных Очередь - Queue. Чтобы использовать очередь, нужно создать объект класса Queue:
Интерфейс типа данных представлен в таблице:
Queue
| Метод | Назначение | Пример |
|---|---|---|
enqueue(el) |
Метод добавляет el в конец очереди. |
q.enqueue(1) |
dequeue() |
Метод удаляет элемент из начала очереди и возвращает его. | v = q.dequeue() |
size() |
Метод возвращает количество элементов в очереди. | q.size() |
Задания для самостоятельной работы
Задания обозначенные значком 📝 выполняются на распечатках или в тетради, обозначенные 💻 - на компьютере в среде программирования.
📝 Задание 1. Матрица смежности
Заполните матрицу смежности для неориентированного графа из вашего варианта.
💻 Задание 2. Использование типа данных Graph (sam02.py)
Используйте тип данных Graph для описания графа из вашего варианта. Выведите на экран:
- матрицу смежности графа;
- список вершин смежных с указанной в варианте;
- являются ли смежными вершины, указанные в варианте.
Выведите список вершин смежных с вершиной 0.
Являются ли смежными вершины 1 и 2.
Выведите список вершин смежных с вершиной 1.
Являются ли смежными вершины 2 и 3.
Выведите список вершин смежных с вершиной 2.
Являются ли смежными вершины 3 и 4.
Выведите список вершин смежных с вершиной 3.
Являются ли смежными вершины 4 и 0.
Выведите список вершин смежных с вершиной 4.
Являются ли смежными вершины 0 и 1.
Выведите список вершин смежных с вершиной 0.
Являются ли смежными вершины 1 и 2.
Выведите список вершин смежных с вершиной 1.
Являются ли смежными вершины 2 и 3.
Выведите список вершин смежных с вершиной 2.
Являются ли смежными вершины 3 и 4.
Выведите список вершин смежных с вершиной 3.
Являются ли смежными вершины 4 и 0.
Выведите список вершин смежных с вершиной 4.
Являются ли смежными вершины 0 и 1.
Выведите список вершин смежных с вершиной 0.
Являются ли смежными вершины 1 и 2.
Выведите список вершин смежных с вершиной 1.
Являются ли смежными вершины 2 и 3.
Выведите список вершин смежных с вершиной 2.
Являются ли смежными вершины 3 и 4.
Выведите список вершин смежных с вершиной 3.
Являются ли смежными вершины 4 и 0.
📝 Задание 3. Алгоритмы обхода вершин графа
Для графа из Задания 1 запишите порядок обхода вершин начиная с вершины 0, используя алгоритм обхода в глубину и в ширину.
💻 Задание 4. Реализация алгоритма обхода графа в глубину (sam04.py)
Реализуйте функцию DFS(g, v) для обхода графа g в глубину, начиная с вершины под номером v.
Используйте следующую блок-схему:
Шаблон решения:
💻 Задание 5. Реализация алгоритма обхода графа в ширину (sam05.py)
Реализуйте функцию BFS(g, v) для обхода графа g в ширину, начиная с вершины под номером v.
Используйте следующую блок-схему:
Шаблон решения:
💻 Задание 6. Проверка
Исправьте код из Задания 4 и Задания 5 так, чтобы проверить правильность выполнения Задания 3 - замените тестовый граф на описание графа из вашего варианта.
💻 Задание 7. Список вершин
Исправьте функцию BFS(g, v) так, чтобы вместо вывода номеров вершин на экран функция возвращала список посещённых вершин.


