Теория игр и исследование операций. Модели, алгоритмы, сложность: Конспект лекций, страница 26

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 ¹ E1. Выберем ребро e = (n1, n2E0 \ E1  с минимальным номером. Пусть n1<n2. Ребра G1 не нумерованы. Пойдем по ним от вершины n1 к n2, пока впервые не встретим такое ребро l = (n3, n4), что n3<n2n4.

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.  Формируем списки соседей всех вершин.