N<n, но искать min не по чему, т.к. O(j)=0 для всех невключенных вершин Þ ребер между включенными и невключенными вершинами нет Þ граф несвязен. Мы построили МОД одной компоненты связности: Dмод=2+1+1+2+2+1+1=10.
Описание алгоритма Прима:
Шаг 0: Инициализация (Если не 0, то пишем в таблицу, если =0, то не пишем)
a) W(1) = O(1) = 1, W(i)=O(i)=0 " i >1
b) " i Î S(1) : O(i)=1, D(i)=d(1,i)
Можно считать, что граф полный. Если ребра (i,j) нет, то d(i,j) = ∞. Или для всех вершин должны быть заданы списки S(i) номеров соседних с i вершин.
Основной шаг:
a) k = argmin D(i), где iÎW -1(0) Ç O -1(>0) , т.е. W (i) = 0 & O (i) ¹ 0.
т.е. берем минимум по «видимым» вершинам. Если таких вершин нет, но пройдены не все вершины, то выход: граф не связен; если пройдены все вершины, то выход: кратчайшее остовное дерево (нормальное завершение)
b) W(k)=1 – включить эту вершину
c) " j Î S(k) & Wj = 0 : O(j)=0 или D(j)>d(k,j)èкоррекция: O(j)=k и D(j)=d(k,j).
Число основных шагов должно быть равно n-1, если пройдем по всем вершинам.
Остовное дерево состоит из ребер (i,O(i)).
Трудоемкость алгоритма Прима: (волновой алгоритм)
Инициализация – линейное время a) – O(n) b) – O(1) c) – O(n) |
Основной шаг (повторяется (n-1) раз): a) – O(n) b) – O(1) c) – коррекция: O(n) Трудоемкость = (n-1)O(n)=O(n2) |
Корректность алгоритма Прима.
Каждый раз подключается новая вершина Þ строится связный граф без циклов и с n-1 ребром Þ алгоритм Прима строит дерево. Почему это МОД?
Утверждение:d(G0)=d(G1), где G0-дерево, построенное алгоритмом Прима, G1-МОД.
Доказательство. Множества вершин в G0 = (V, E0) и G1 = (V, E1) совпадают. Пронумеруем вершины и ребра G0 в порядке их включения алгоритмом Прима.
У каждой вершины только один сосед в G0 с меньшим номером – «отец»!
Введем целочисленное расстояние
Пусть E0 ¹ E 1. Выберем ребро e = (n1, n2)ÎE0 \ E1 с минимальным номером. Пусть n1<n2 . Ребра G1 не нумерованы. Пойдем по ним от вершины n1 к n2, пока впервые не встретим такое ребро l = (n3, n4), что n3<n2≤n4.
1. n2=n4 Þ lÏ E0 , иначе n2 имеет в G0 двух соседей n1,n3 < n2.
2. n2<n4 Þ если lÎ E0 , то номер ребраl больше номера ребра e.
В любом случае граф G2 = (V, E1 + e - l) является деревом и ρ (G0,G2) < ρ (G0,G1) (число ребер = n-1, при добавлении ребра e появился цикл, а при удалении ребраl из цикла связность не нарушится, min номер ребра в E0 \ E1 увеличивается).
Ребра e,l ÎR (W) на шаге n2 и алгоритм Прима выбрал ребро e Þ d(e) ≤ d(l) Þ d(G2) ≤ d(G1). Но G1 – МОД. Поэтому d(G2)=d(G1). Þ G2 – тоже МОД.
Повторим в цикле выбор ребер e и l и переход от Gk к Gk+1. На каждом шаге ρ (Gk,G1) убывает по крайней мере на 1 и не позже, чем через n-1 шаг будет =0, т.е. деревья G0 и Gk совпадут. Получили цепочку: d(Gk = G0) = … = d(G1).
Пример. На шаге n2=7 вершины n1=2 и n3=5 будут включены, а n2 и n4=9 нет.
№20. Алгоритм Тарьяна (для планарных графов МОД строится за O(n)).
NKS |
BV |
i |
Соседи |
I |
4 |
1 |
2 4 5 |
II |
3 |
2 |
1 5 3 |
II |
2 |
3 |
2 5 6 |
I |
1,5 |
4 |
1 5 7 |
I |
4 |
5 |
1 4 7 8 6 3 2 |
III |
9 |
6 |
3 5 8 9 7 |
IV |
8 |
7 |
6 8 5 4 |
IV |
7 |
8 |
9 6 5 7 |
III |
6 |
9 |
8 6 |
макрограф
тоже планарный
Этап 1. Этап 2.
На каждом шаге число операций ≈ числу дуг=2R<6n
1. Формируем списки соседей всех вершин.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.