Пт. Окт 16th, 2026
Графы: основные понятия и представление

Графы: основные понятия и представление

Теория для подготовки к ЕГЭ по информатике. Раздел 2.13: Графы, их представление и алгоритмы работы с ними.

Основные понятия графов

Граф — это математическая структура, состоящая из множества вершин (узлов) и множества рёбер (связей) между ними.

Основные термины:

  • Вершина (узел) — основной элемент графа
  • Ребро (дуга) — связь между двумя вершинами
  • Степень вершины — количество рёбер, инцидентных вершине
  • Путь — последовательность вершин, соединённых рёбрами
  • Цикл — путь, начинающийся и заканчивающийся в одной вершине
A B C D

Виды графов

Графы можно классифицировать по различным признакам:

Тип графа Описание Пример
Неориентированный Рёбра не имеют направления Дороги между городами
Ориентированный Рёбра имеют направление (дуги) Одностороннее движение
Взвешенный Рёбрам присвоены числовые значения (веса) Расстояния между городами
Не взвешенный Рёбра не имеют весов Социальные связи
Связный Между любыми двумя вершинами существует путь Дерево
Несвязный Имеются изолированные компоненты Острова
Ациклический Не содержит циклов Дерево, направленный ациклический граф (DAG)

Пример ориентированного ациклического графа (DAG):

A B C D

Этот граф ориентированный и не содержит циклов.

Матрица смежности

Матрица смежности — это квадратная матрица, показывающая связи между вершинами графа.

Для графа с n вершинами матрица смежности имеет размер n × n, где элемент a[i][j] равен:

  • 1 (или весу ребра) — если есть ребро из вершины i в вершину j
  • 0 — если ребра нет

Пример графа и его матрицы смежности:

1 2 3
1
2
3
1
0
1
1
2
1
0
1
3
1
1
0

Особенности матрицы смежности:

  • Для неориентированных графов матрица симметрична относительно главной диагонали
  • Для ориентированных графов матрица может быть несимметричной
  • Занимает много памяти для разреженных графов (\(O(n^2)\))
  • Быстрый доступ к наличию ребра между вершинами (\(O(1)\))

Весовые матрицы

Для взвешенных графов используется весовые матрицы, где вместо 1 указывается вес ребра.

Пример взвешенного графа и его матрицы:

A B C 5 3 7
A
B
C
A
0
5
3
B
5
0
7
C
3
7
0

Примечание: Если ребра между вершинами нет, в весовой матрице обычно указывают:

  • 0 — если вес может быть только положительным
  • ∞ (бесконечность) — если возможны отрицательные веса

Списки смежности

Список смежности — это структура данных, где для каждой вершины хранится список смежных с ней вершин.

Пример графа и его списка смежности:

A B C
A: B, C
B: A, C
C: A, B

Преимущества и недостатки списков смежности:

  • Экономия памяти для разреженных графов (\(O(n + m)\))
  • Быстрое получение всех соседей вершины
  • Медленная проверка наличия ребра между вершинами (\(O(deg(v))\))

Построение оптимального пути между вершинами

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

Алгоритм Дейкстры:

  1. Присвоить начальной вершине вес 0, а всем остальным — бесконечность
  2. Поместить все вершины в непосещённые
  3. Пока есть непосещённые вершины:
    • Выбрать вершину с минимальным весом
    • Обновить веса её соседей
    • Пометить вершина как посещённую

Пример работы алгоритма Дейкстры:

A B C D 2 1 5 3
// Находим кратчайший путь от A до D
Шаг 1: A(0), B(∞), C(∞), D(∞)
Шаг 2: Посещаем A, обновляем B=2, C=1
Шаг 3: Посещаем C, обновляем D=1+3=4
Шаг 4: Посещаем B, обновляем D=min(4, 2+5)=4
Кратчайший путь: A→C→D (длина 4)

Определение количества путей в ориентированном ациклическом графе

Для ориентированного ациклического графа (DAG) можно эффективно посчитать количество путей между вершинами.

Алгоритм:

  1. Выполнить топологическую сортировку вершин
  2. Присвоить начальной вершине значение 1 (один путь)
  3. Для каждой последующей вершины в порядке топологической сортировки:
    • Установить количество путей равным сумме путей всех предшественников

Пример подсчёта количества путей:

A B C D
Топологический порядок: A, B, C, D
paths[A] = 1
paths[B] = paths[A] = 1
paths[C] = paths[A] = 1
paths[D] = paths[B] + paths[C] = 1 + 1 = 2
Количество путей от A до D: 2

Практические рекомендации

При решении задач с графами:

  • Выбирайте подходящее представление графа в зависимости от задачи
  • Для плотных графов используйте матрицы смежности
  • Для разреженных графов используйте списки смежности
  • Для поиска кратчайших путей во взвешенных графах применяйте алгоритм Дейкстры
  • Для подсчёта путей в DAG используйте топологическую сортировку

Пример выбора представления графа:

// Матрица смежности для плотного графа
int graph[V][V] = {
  {0, 1, 1, 0},
  {1, 0, 1, 1},
  {1, 1, 0, 1},
  {0, 1, 1, 0}
};

// Список смежности для разреженного графа
vector<list<int>> graph(V);
graph[0].push_back(1);
graph[0].push_back(2);
graph[1].push_back(0);
graph[1].push_back(2);
graph[1].push_back(3);
// …