Минимально узкое остовное дерево
Минимально узкое остовное дерево (англ. Minimum bottleneck spanning tree, MBST) в связанном взвешенном неориентированном графе остовное дерево графа, у которого максимальное ребро минимально. Узким ребром в графе назовём максимальное по весу. Остовное дерево является минимально узким, если в графе нет остовного дерева с меньшим узким ребром.
этоЗадача MBST и минимальное остовное дерево
Определение с MBST: |
Минимальное остовное дерево является minimum bottleneck spanning tree. |
Предположим, если минимальное остовное не является MBST, значит в графе существует набор ребер которые мы не взяли в наш остов, при замене на которые, наше дерево станет MBST. Так же рёбра вне остова должны быть меньше рёбер из остова, чтобы уменьшить минимальное максимально ребро. Но по определению MST, сумма рёбер дерева минимальна, значит вне остова нету рёбер с меньшим весом. Так как наше предположение неверно, MST является MBST. |
Определение с MBST: |
Minimum bottleneck spanning tree не всегда является минимальным остовным деревом. |
Рассмотрим пример, где MBST не является минимальным остовным деревом: |
Является ли остовное дерево MBST
Задача: |
Проверка остовного дерева на MBST. |
Алгоритм
Если у нас получится соединить все вершины графа, используя рёбра меньше максимального из нашего остова, значит мы сможем построить другой остов, в котором максимальное ребро меньше нашего максимального. Для этого найдём максимальное ребро в нашем дереве. Соединим все вершины, между которыми рёбра с весом меньше максимального при помощи СНМ. Если в результате у нас все вершины лежат в одном множестве, значит наше дерево не является MBST, иначе оно MBST.
Асимптотика
По каждому ребру пройдём один раз, для поиска максимального, займёт
Работа с СНМ займет , где — обратная функция Аккермана, которая не превосходит во всех практических приложениях и которую можно принять за константу.
В результате получаем алгоритм работающий за линейное время .
Псевдокод
Все рёбра графа будем хранить в списке
В каждом ребре храним следующую информацию:
- — соединяемые вершины
- — вес ребра
bool ifMBST(Edge[] e, Edge[] tree):
int united = 0 // Сколько вершин мы объединили
int maxEdge = -
for i = 1 to tree.size
maxEdge = max(maxEdge, tree[i].cost) // Поиск максимального ребра в дереве
for i = 1 to n
if e[i].cost >= maxEdge // Не соединяем вершины, если ребро не меньше максимального
continue
if find(e[i].from]) != find(e[i].to) // Объединяем вершины, если они в разных множествах
united++
unite(e[i].from,e[i].to)
if united == e.size - 1 // Дерево подходит, если в результате мы соединили все вершины
return true
else
return false