Кладовочка

О разном, чтобы было под рукой онлайн

Дискретная математика: графы, алгоритмы и где это применяется

Графы

Граф — абстрактная структура из вершин и рёбер. На первый взгляд — чистая математика. На деле — соцсети, GPS-навигация, компиляторы, маршрутизация в интернете, рекомендательные системы и логистика.

Базовые понятия

Термин Определение Пример
Вершина ($V$) Узел графа Человек в соцсети, город на карте
Ребро ($E$) Связь между вершинами Дружба, дорога
Степень вершины Число рёбер из вершины Количество друзей
Путь Последовательность вершин, соединённых рёбрами Маршрут между городами
Цикл Путь, начинающийся и заканчивающийся в одной вершине Кольцевая дорога
Компонента связности Максимальный подграф, где из любой вершины можно дойти до любой Изолированная группа друзей

Ориентированный vs неориентированный

  • Неориентированный: дружба в Facebook (взаимная)
  • Ориентированный: подписка в Instagram (А подписан на Б, но не наоборот)

Взвешенный граф

Каждому ребру приписано число — вес (расстояние, стоимость, пропускная способность).

Виды графов

Тип Свойства Пример
Полный $K_n$ Все вершины попарно соединены $K_5$ — полный граф из 5 вершин
Дерево Связный граф без циклов Иерархия папок, оргструктура
Двудольный Вершины разделены на 2 доли, рёбра только между долями Задачи ↔ исполнители
Планарный Можно нарисовать на плоскости без пересечения рёбер Карта метро, печатная плата
Эйлеров Существует путь через все рёбра по одному разу Задача о кёнигсбергских мостах
Гамильтонов Существует путь через все вершины по одному разу Задача коммивояжёра

Теорема о сумме степеней

Сумма степеней всех вершин равна удвоенному числу рёбер:

$$\sum_{v \in V} \deg(v) = 2|E|$$

Следствие: в любом графе число вершин с нечётной степенью чётно (лемма о рукопожатиях).

Алгоритмы на графах

1. Поиск в ширину (BFS)

Обходит граф «по уровням» от начальной вершины. Очередь.

Применение: кратчайший путь в невзвешенном графе, поиск друзей в соцсети по уровням (друзья, друзья друзей, ...).

Сложность: $O(V + E)$

Идея: заходим в вершину, кладём всех непосещённых соседей в очередь. Обрабатываем по очереди.

2. Поиск в глубину (DFS)

Уходит «вглубь» до упора, затем возвращается. Стек (рекурсия).

Применение: топологическая сортировка, поиск циклов, проверка связности, поиск компонент.

Сложность: $O(V + E)$

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

Кратчайший путь во взвешенном графе с неотрицательными весами.

Идея: поддерживаем множество «обработанных» вершин и минимальное расстояние до каждой. На каждом шаге выбираем необработанную вершину с минимальным расстоянием.

Сложность: $O(V^2)$ или $O(E \log V)$ с кучей.

Применение: Яндекс.Навигатор, построение маршрутов.

4. Алгоритм A*

Улучшение Дейкстры с эвристикой — оценкой оставшегося расстояния.

$$f(v) = g(v) + h(v)$$

  • $g(v)$ — расстояние от старта до $v$ (известно)
  • $h(v)$ — эвристическая оценка от $v$ до цели

Если $h(v)$ никогда не переоценивает реальное расстояние (допустимая эвристика), A* находит оптимальный путь. В игровых движках (Unity, Unreal) — основной алгоритм поиска пути.

5. Алгоритм Беллмана—Форда

Как Дейкстра, но работает и с отрицательными весами (но без отрицательных циклов). Медленнее: $O(VE)$.

Применение: арбитраж валют (поиск отрицательных циклов → прибыльная цепочка обмена).

6. Алгоритм Флойда—Уоршелла

Все кратчайшие пути между всеми парами вершин. Динамическое программирование. $O(V^3)$.

7. Топологическая сортировка

Упорядочивание вершин так, что каждое ребро идёт от более ранней вершины к более поздней. Работает только для ациклических ориентированных графов (DAG).

Применение: порядок компиляции модулей, построение расписания курсов с пререквизитами, разрешение зависимостей в сборочных системах (Make, Gradle).

Остовное дерево (MST)

Остовное дерево — подграф из всех $V$ вершин и $V-1$ рёбер без циклов, соединяющий все вершины.

Алгоритм Краскала

Сортируем рёбра по весу. Добавляем, если не создаёт цикл (проверка через систему непересекающихся множеств — DSU). $O(E \log E)$.

Алгоритм Прима

Растим дерево от одной вершины, на каждом шаге добавляя минимальное ребро к непосещённой вершине. $O(E \log V)$ с кучей.

Применение: прокладка сетей (электричество, интернет) с минимальной стоимостью, кластеризация.

Раскраска графов

Присвоение цветов вершинам так, чтобы смежные вершины имели разные цвета. Хроматическое число $\chi(G)$ — минимальное число цветов.

Применение:

  • Распределение радиочастот (соседние вышки — разные частоты)
  • Расписание экзаменов (студент не может сдавать два экзамена одновременно)
  • Компиляция: распределение регистров процессора

Теорема о четырёх красках: любой планарный граф можно раскрасить в 4 цвета. Доказана в 1976 году (первое доказательство с использованием компьютера).

Реальные применения

Социальные сети

Люди = вершины, дружба/подписка = рёбра.

  • Степень вершины → популярность
  • Компоненты связности → изолированные сообщества
  • Кратчайший путь → теория шести рукопожатий (диаметр графа Facebook ≈ 4.57)
  • Центральность (betweenness centrality) → кто связывает разные группы, ключевые инфлюенсеры

Интернет и маршрутизация

  • Маршрутизаторы = вершины, каналы = рёбра с весами (задержка, пропускная способность)
  • Протокол OSPF использует алгоритм Дейкстры для поиска кратчайшего пути внутри автономной системы
  • BGP строит деревья маршрутов между автономными системами

PageRank (Google)

Граф веб-страниц: страницы = вершины, ссылки = ориентированные рёбра. PageRank — случайное блуждание с вероятностью «телепортации». Математика: собственный вектор матрицы переходов.

Логистика и цепи поставок

Задача коммивояжёра (TSP): посетить $n$ городов, вернуться в начальный, минимальная суммарная длина. NP-полная задача. На практике — эвристики и приближённые алгоритмы.

Рекомендательные системы

Двудольный граф: пользователи ↔ товары. Коллаборативная фильтрация: «люди, которым понравилось то же, что и вам, также купили...»

Компиляторы

Абстрактное синтаксическое дерево (AST) — граф исходного кода. Оптимизации: удаление мёртвого кода (недостижимые вершины), общие подвыражения (изоморфные подграфы). Граф потока управления (CFG) для анализа достижимости и циклов.

Продвинутые концепции

Потоки в сетях

Ориентированный граф с источником и стоком, рёбра имеют пропускную способность. Задача: максимизировать поток от источника к стоку.

Алгоритм Форда—Фалкерсона ищет увеличивающие пути. Теорема о максимальном потоке и минимальном разрезе — фундаментальный результат.

Применение: распределение трафика, планирование производства, задача о назначениях, сегментация изображений.

Кластеризация графов

Разбиение вершин на группы с плотными внутренними связями и разреженными внешними. Спектральная кластеризация через собственные векторы матрицы Лапласа. Применение: сегментация клиентов, выделение сообществ, анализ социальных сетей.

Итого

Графы — это универсальный язык для описания связей. Таблица «задача — алгоритм»:

Задача Алгоритм Сложность
Кратчайший путь (без весов) BFS $O(V+E)$
Кратчайший путь (с весами) Дейкстра $O(E \log V)$
Кратчайший путь (отрицательные веса) Беллман—Форд $O(VE)$
Все кратчайшие пути Флойд—Уоршелл $O(V^3)$
Минимальное остовное дерево Краскал / Прим $O(E \log E)$
Топологическая сортировка DFS + стек $O(V+E)$
Максимальный поток Форд—Фалкерсон $O(E \cdot f_{max})$
Поиск цикла DFS $O(V+E)$
Проверка двудольности BFS/DFS + раскраска $O(V+E)$