4.10. Покрывающие деревья минимальной стоимости
Пусть задан граф со взвешенными рёбрами и его покрывающее дерево. Сумма весов рёбер, принадлежащих покрывающему дереву, называется стоимостью дерева. Покрывающее дерево графа, имеющее наименьшую стоимость по сравнению со всеми другими покрывающими деревьями этого же графа, называется покрывающим деревом минимальной стоимости.
Рассмотрим задачи, решение которых сводится к нахождению покрывающего дерева минимальной стоимости.
Задача 1. В управлении шоссейных дорог рассматривается проект строительства новых дорог, которые должны связать несколько городов некоторого района (причём не обязательно непосредственно каждую пару городов). Стоимость прокладки дороги между каждой парой городов известна. Необходимо определить, между какими городами нужно проложить дороги, чтобы суммарная стоимость прокладки дорог была минимальной.
Задача 2. Необходимо соединить проводами клеммы электрической сети, минимизируя длину проводника. Расстояния между каждой парой клемм известно.
Для нахождения покрывающего дерева минимальной стоимости можно получить все покрывающие деревья, определить их стоимость и выбрать дерево минимальной стоимости. Такой подход не является эффективным.
Алгоритм Краскала строит покрывающее дерево минимальной стоимости, если рёбра графа просматривать в порядке неубывания их весов. Поэтому для нахождения покрывающего дерева минимальной стоимости можно предварительно использовать алгоритм сортировки рёбер, а затем применить алгоритм Краскала. Тогда на каждом шаге будет выбираться ребро с минимальным весом, которое можно включить в покрывающее дерево. Такой выбор можно осуществить и в процессе выполнения алгоритма Краскала без предварительной сортировки рёбер. В этом случае при выборе ребра используем алгоритм нахождения ребра минимального веса среди рёбер, не включённых в дерево, при этом все рёбра, образующие цикл с рёбрами, включёнными в дерево, исключаются из дальнейшего рассмотрения.
Рассмотрим ещё один алгоритм построения покрывающего дерева минимальной стоимости, не требующий предварительной сортировки рёбер. Это алгоритм Прима (алгоритм ближайшего соседа). Он отличается от алгоритма Краскала тем, что в нём формируется только один букет. На очередном шаге выбирается ребро минимального веса среди рёбер, у которых одна концевая вершина принадлежит букету, а другая – не принадлежит. Такое ребро включается в дерево, а концевая вершина, не принадлежащая букету, включается в него.
Для эффективного выбора ребра в алгоритме Прима каждой вершине vi графа, не принадлежащей букету Б приписывается метка t(vi) – «ближайшая» к vi вершина, принадлежащая букету Б, и число d(vi) – вес ребра {t(vi),vi}. На каждом шаге выполнения алгоритма вершина vi с наименьшим числом d(vi) добавляется к букету Б, а ребро {t(vi),vi} – к покрывающему дереву. После добавления новой вершины vi к букету Б метка t(vj) и число d(vj) вершины vj, не принадлежащей букету, изменятся, если вес ребра {vi,vj} меньше числа d(vj)
Алгоритм Прима.
Вход: G=(V,E) - взвешенный граф, где
V – множество вершин,
E – множество рёбер.
Выход: T – покрывающее дерево минимальной стоимости.
1. Начальная установка.
Каждой вершине vi приписать t(vi)=0;
Б:={v}, v –произвольная вершина графа включается в букет Б;
каждой вершине vi, не принадлежащей букету, приписать d(vi)= ,
y:=v, y – последняя вершина, включённая в букет;
T:=, дерево пусто.
2. Пересчёт чисел d(vi) и меток t(vi).
viГ(y)-Б пересчитать d(vi):
d(vi):=min(d(vi), вес{y,xi}).
Если число d(vi) изменилась (уменьшилась), то t(vi):=y.
3. Из всех вершин viБ выбрать вершину vj с наименьшим числом d(vj);
Б:=Б{vj}, включить выбранную вершину в букет;
y:=vj, y – последняя вершина, включённая в букет;
T:=T{t(vi),vi}, добавить ребро в дерево.
4. Если все вершины графа включены в букет (Б=V), то конец алгоритма, иначе перейти к п.2
При программной реализации алгоритма Прима букет можно представить бинарным массивом Б, i-ый элемент которого соответствует вершине vi и, если вершина vi принадлежит букету, то Бi=1, иначе Бi=0. Числа d(vi) целесообразно хранить в массиве D, i-ый элемент которого соответствует вершине vi , а его значение Di - числу d(vi). Для хранения меток t(vi) можно использовать массив T, i-ый элемент которого соответствует вершине vi , а его значение Ti – метке t(vi). Заметим, что массив T по окончании алгоритма хранит полную информацию о структуре построенного покрывающего дерева минимальной стоимости: пара {Ti,i} соответствует ребру дерева, если Ti≠0, а сумма всех элементов массива D равна стоимости дерева.
Работу алгоритма Прима при построении покрывающего дерева минимальной стоимости графа, диаграмма которого изображена на рис.4.26, представим в таблице 4.4, отображающей изменения значений массивов Б, D и T на каждом шаге выполнения алгоритма.
v2 2 v4
1 2
v1 v6
7 4 8
9 5
5
v3 v5
Рис.4.26. Диаграмма графа
Таблица 4.4
Do'stlaringiz bilan baham: |