Skip to content

Практическая работа №17. Работа с графами

Практическая работа №17

Section titled “Практическая работа №17”
  • Изучить основные понятия теории графов
  • Познакомиться со способами представления графов в памяти компьютера
  • Реализовать алгоритмы обхода графа:
    • DFS (поиск в глубину)
    • BFS (поиск в ширину)
  • Научиться использовать стек, очередь и рекурсию

1. Теоретические сведения

Section titled “1. Теоретические сведения”

Граф — это структура данных, состоящая из:

  • вершин (узлов)
  • рёбер (связей между вершинами)

Формально граф записывается так:

G = (V, E)

где:

  • V — множество вершин
  • E — множество рёбер
0 ---- 1
| |
2 ---- 3

Путь — последовательность вершин, соединённых рёбрами.

Цикл — путь, который начинается и заканчивается в одной вершине.

Степень вершины — количество рёбер, связанных с вершиной.

Компонента связности — подграф, в котором существует путь между любой парой вершин.


Неориентированный граф

Section titled “Неориентированный граф”
A ---- B

Движение возможно в обе стороны.


A → B

Движение возможно только по направлению стрелки.


A --5--> B

Число означает вес ребра (например расстояние).


4. Представление графа в памяти

Section titled “4. Представление графа в памяти”

Граф можно хранить в виде двумерного массива.

Если между вершинами i и j есть ребро:

A[i][j] = 1

иначе:

A[i][j] = 0
012
0011
1100
2100

Память: O(N²)


Каждая вершина хранит список своих соседей.

Пример:

0 → 1, 2
1 → 0
2 → 0

Память: O(V + E)


Основные алгоритмы обхода:

АлгоритмИспользует
DFSстек / рекурсия
BFSочередь

Алгоритм:

  1. Начать с выбранной вершины
  2. Перейти к соседней вершине
  3. Продолжать движение вглубь
  4. Если дальше идти нельзя — вернуться назад

Алгоритм:

  1. Начать с вершины
  2. Посетить всех соседей
  3. Затем соседей этих соседей

Используется очередь.


6. Практическое задание

Section titled “6. Практическое задание”

Необходимо разработать консольную программу на C++, которая выполняет обход графа.

Граф необходимо хранить в виде матрицы смежности.


Используйте следующий граф:

const int N = 7;
0 1 1 0 0 0 0
1 0 0 1 1 0 0
1 0 0 0 0 0 1
0 1 0 0 0 1 0
0 1 0 0 0 1 0
0 0 0 1 1 0 0
0 0 1 0 0 0 0

Количество вершин: 7


Реализуйте алгоритм DFS (поиск в глубину).

Требования:

  • использовать стек
  • вывести порядок обхода вершин

Пример вывода:

DFS обход графа:
0 1 3 5 4 2 6

(порядок может отличаться)


Реализуйте алгоритм BFS (поиск в ширину).

Требования:

  • использовать очередь
  • вывести порядок обхода вершин

Пример вывода:

BFS обход графа:
0 1 2 3 4 6 5

10. Дополнительное задание

Section titled “10. Дополнительное задание”

Определите количество компонент связности в графе.

Подсказка:

  • если вершина ещё не посещена
  • запустите DFS
  • увеличьте счётчик компонент

11. Тестовые данные для проверки

Section titled “11. Тестовые данные для проверки”

Граф:

0 - 1 - 2 - 3 - 4

Ожидаемый DFS:

0 1 2 3 4

Компоненты связности:

1

Граф:

0
|
1
|
2

Ожидаемый DFS:

0 1 2

Компоненты связности:

1

Несвязный граф:

0 - 1
2 - 3

Ожидаемый DFS (с 0):

0 1

Количество компонент:

2

Граф:

0 - 1 - 2
|
3

Пример DFS:

0 1 2 3

12. Требования к программе

Section titled “12. Требования к программе”

Программа должна:

  • корректно реализовывать DFS
  • корректно реализовывать BFS
  • выводить порядок обхода
  • использовать стек и очередь
  • корректно компилироваться

  1. Что такое граф?
  2. Какие элементы содержит граф?
  3. Чем ориентированный граф отличается от неориентированного?
  4. Что такое матрица смежности?
  5. Чем DFS отличается от BFS?
  6. Какие структуры данных используются в этих алгоритмах?