Алгоритмы и структуры данных (С++), лекция №12 (осень)

YOUTUBE · 01.12.2025 06:08

Ключевые темы и таймкоды

Введение в обходы графа

0:26
  • Приветствие слушателей и объявление темы лекции: обходы графа в глубину и в ширину.
  • Упоминание о планах обсудить двудольные графы.

Пример обхода в глубину

1:20
  • Использование иерархического дерева как примера для объяснения обхода в глубину.
  • Начало обхода с верхнего уровня и постепенное «зажигание» вершин.
  • Объяснение процесса обхода: движение по ветвям до достижения края, затем возврат и продолжение обхода.

Логика обхода в глубину

3:19
  • Детальное объяснение логики обхода: движение вглубь до края, возврат и поиск альтернативных путей.
  • Пример нумерации вершин по последовательности обхода.

Применение обхода в глубину

5:12
  • Пример с деревом вызовов функции Фибоначчи для иллюстрации обхода в глубину.
  • Подчёркивание универсальности обхода в глубину для любых графов.
  • Упоминание аббревиатуры DFS для обхода в глубину.

Обход в ширину BFS

6:10
  • Объяснение логики обхода в ширину BFS.
  • Постепенное расширение обхода от стартовой вершины ко всем соседям.
  • Пример с дополнительными рёбрами для иллюстрации процесса.

Образное описание BFS

9:07
  • Аналогия с организацией дискотеки: стартовая вершина — Вася, который зовёт друзей.
  • Каждый друг зовёт своих ещё не званных друзей, дожидаясь ответа от каждого из них.
  • Важность ожидания завершения обхода всех соседей для окончательного прохождения вершины.

Реализация BFS

11:04
  • Описание рекурсивной реализации обхода в ширину.
  • Вершина считается пройденной после завершения обхода всех её соседей.
  • Использование рекурсии для вызова обхода соседей.

Завершение обхода

16:59
  • Процесс завершения обхода: проверка всех смежных вершин и возвращение при отсутствии непройденных соседей.
  • Возможность раскрашивания вершин в три цвета для визуализации процесса.

Цветовые обозначения вершин

17:57
  • Белый цвет: обход не начат.
  • Серый цвет: обход начат, но не закончен.
  • Чёрный цвет: обход закончен.

Логика обхода

18:56
  • При достижении крайней вершины обход завершается.
  • Вершины, не имеющие смежных вершин, считаются крайними.

Применение обхода в глубину

20:55
  • Обход в глубину позволяет полностью пройти компоненту графа.
  • Вершины в разных компонентах связности не пересекаются.
  • Пример использования: подсчёт количества компонент связности.

Проверка пройденных вершин

21:53
  • Для проверки пройденных вершин используется структура данных.
  • Можно использовать массив логических значений или номера вершин.

Реализация обхода графа в глубину

23:49
  • Создание структуры данных для графа.
  • Использование словаря для хранения списков смежных вершин.

Структура данных для графа

29:35
  • Основная структура данных — словарь.
  • каждой вершине соответствует список смежных вершин.

Создание пустых списков смежности

34:25
  • Создание пустых списков смежности для каждой вершины.
  • Использование конструктора по умолчанию для создания пустых множеств.

Подготовка к считыванию рёбер

35:22
  • Определение количества вершин в графе.
  • Создание пустых списков смежности перед считыванием рёбер.

Создание графа и списков смежности

36:22
  • Вершины графа изолированы и не соединены.
  • Считывание соседей вершин с клавиатуры.
  • Добавление вершин в списки смежности.

Распечатка списков смежности

37:21
  • Цикл для распечатки списков смежности для каждой вершины.
  • Использование вложенных циклов для печати списков соседей.
  • Проблемы с выводом лишних запятых и пробелов.

Тестирование реализации

42:03
  • Ввод графа и его сохранение в текстовом файле.
  • Пример графа с 5 вершинами и 7 рёбрами.
  • Проверка соответствия списков смежности реальному графу.

Организация кода

46:55
  • Вынесение реализации графа в отдельную библиотеку.
  • Создание заголовочного файла для библиотеки.
  • Добавление стража включения для заголовочного файла.

Реализация обхода в глубину

50:47
  • Передача графа в функцию обхода.
  • Использование константной ссылки на граф.
  • Создание структуры данных для отметки пройденных вершин.
  • Рекурсивная реализация обхода в глубину.

Структура данных для обхода в глубину

53:42
  • Необходима структура данных для хранения множества ранее пройденных вершин.
  • Рассматриваются варианты использования статического массива или изменяемого вектора.
  • Вектор должен хранить логические значения «пройдено» или «не пройдено».

Начало обхода стартовой вершины

55:37
  • Обход начинается с отметки стартовой вершины.
  • Используется пример с приглашением на дискотеку для объяснения процесса обхода.
  • Вершина отмечается как «позванная» и начинается обход её соседей.

Обход соседей стартовой вершины

56:37
  • Для каждого соседа стартовой вершины запускается DFS.
  • Соседям передаётся информация о графе и массив использованных вершин.
  • В текущей версии функции отсутствует проверка на крайние случаи.

Проверка состояния вершин

1:01:27
  • Обход запускается только если сосед не отмечен в массиве использованных вершин.
  • Добавляется вывод номеров вершин на экран для отслеживания процесса обхода.

Запуск функции DFS

1:04:21
  • Функция DFS компилируется и запускается с использованием графа из файла.
  • Пользователь вводит стартовую вершину для обхода.
  • Создаётся вектор использованных вершин с начальным состоянием, соответствующим количеству вершин в графе.

Тестирование функции

1:09:13
  • Тестируется функция на графе с тремя вершинами и двумя рёбрами.
  • Проверяется обход линейной структуры графа.
  • При попытке обхода более сложного графа возникает ошибка сегментации.

Проблемы с инициализацией и вводом данных

1:11:11
  • Обнаружена проблема с неинициализированной переменной.
  • Выяснилось, что ввод данных из файла input.txt не был корректен.
  • Решено использовать нулевую вершину в качестве стартовой.

Анализ обхода вершин

1:13:00
  • Обход вершин начался с 0 и 1, но затем произошёл откат из-за отсутствия ребра.
  • Показан обратный ход обхода при распечатывании результатов.

Обсуждение подходов к обучению

1:14:44
  • Размышления о разных подходах преподавателей к обучению студентов.
  • Подчёркивается важность адекватного уровня сложности материала.

Объяснение обхода в ширину

1:16:41
  • Пример с пожаром на графе для иллюстрации обхода в ширину.
  • Объяснение последовательности поджигания соседей вершины.

Понятие дерева и основного дерева

1:18:38
  • Определение дерева как графа без циклов.
  • Объяснение понятия основного дерева графа.
  • Упоминание о возможности построения основного дерева с помощью обхода в ширину.

Логика обхода в ширину

1:22:32
  • Описание логики обхода в ширину с использованием очереди.
  • Вершины отмечаются как использованные и добавляются в конец очереди.
  • Объяснение процесса поджигания соседей текущей вершины.

Реализация обхода в ширину

1:26:25
  • Использование очереди FIFO для реализации обхода в ширину.
  • Начало обхода с заполнения очереди стартовой вершиной.
  • Подготовка массива для отслеживания пройденных вершин.

Подготовка к обходу в глубину

1:27:24
  • Создание массива для хранения вершин.
  • Использование очереди для управления обходом.
  • Передача массива и очереди в функцию.

Начало обхода

1:28:21
  • Создание очереди для хранения «зажжённых» вершин.
  • Добавление стартовой вершины в очередь.
  • Начало цикла while для обхода.

Работа с очередью

1:30:10
  • Проверка пустоты очереди с помощью функции empty.
  • Извлечение текущей вершины из очереди.
  • Отметка текущей вершины как «зажжённой».

Обход соседей

1:32:04
  • Проверка соседей текущей вершины.
  • Добавление соседей в список «зажжённых», если они ранее не использовались.
  • Модификация списка «зажжённых» вершин.

Исправление ошибок

1:35:00
  • Исправление ошибок в коде, связанных с использованием очереди.
  • Подключение необходимой библиотеки.
  • Коррекция ошибок в синтаксисе.

Тестирование программы

1:40:35
  • Добавление вывода информации о вершинах.
  • Запуск программы и проверка её работы.
  • Вывод стартовой вершины и перевод строки в конце.

Завершение

1:41:35
  • Подведение итогов обхода в глубину.
  • Упоминание о репозитории на GitHub.
  • Прощание с аудиторией.