Калькулятор минимального остовного дерева

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

Формат ввода
Алгоритм
По ребру в строке: «A B 5». Граф неориентированный.
Какое дерево
Вес минимального остовного дерева—
Рёбра дерева—
Вес всего графа—

Шаги алгоритма

Рекламный блок «после калькулятора» (ads/after-calc.html)

Что такое остовное дерево

Остовное дерево связного графа — подграф, который содержит все вершины, связен и не имеет циклов. В нём ровно n − 1 ребро, где n — число вершин. Минимальное остовное дерево (МОД) — остовное дерево с наименьшей суммой весов рёбер. Классическая задача: проложить кабель, трубы или дороги между пунктами так, чтобы все были соединены, а суммарная длина или стоимость была минимальной.

Если граф несвязный, остовного дерева нет; вместо него строится остовный лес — по дереву на каждую компоненту связности, всего n − c рёбер, где c — число компонент.

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

Рёбра сортируются по возрастанию веса и просматриваются по очереди. Ребро добавляется в дерево, если соединяет вершины из разных частей, и отбрасывается, если образует цикл с уже выбранными рёбрами. Для быстрой проверки используется система непересекающихся множеств. Алгоритм останавливается, когда набрано n − c рёбер. Время работы — O(m log m), основное время уходит на сортировку.

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

Дерево выращивается из одной начальной вершины. На каждом шаге выбирается самое лёгкое ребро, которое соединяет вершину дерева с вершиной вне его, и эта вершина присоединяется к дереву. Время работы — O(n²) для плотных графов или O(m log n) с кучей. Если граф несвязный, после исчерпания компоненты калькулятор начинает новое дерево с первой непосещённой вершины.

Рекламный блок «внутри статьи» (ads/in-article.html)

Почему оба алгоритма дают минимум

Оба алгоритма опираются на свойство разреза: если разбить вершины на две группы, то самое лёгкое ребро между группами входит в какое-нибудь минимальное остовное дерево. Крускал и Прим на каждом шаге добавляют именно такое ребро, поэтому получают дерево одного и того же минимального веса. Если веса рёбер различны, минимальное остовное дерево единственно; при одинаковых весах деревьев может быть несколько, и алгоритмы могут выбрать разные рёбра.

Максимальное остовное дерево

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

Пример

В графе из примера 7 вершин и 11 рёбер. Крускал берёт рёбра по возрастанию веса: A–D (5), C–E (5), D–F (6), A–B (7), B–E (7). Ребро B–C (8) отбрасывается — B и C уже соединены через E; так же отбрасываются E–F (8) и B–D (9). Последним добавляется E–G (9). Получается 6 рёбер и суммарный вес 5 + 5 + 6 + 7 + 7 + 9 = 39.

Рекламный блок «внизу страницы» (ads/bottom.html)