Связность
Известны два классических алгоритма установления связности обыкновенный графов.
Алгоритм Крускала (Kruskal)
Пусть имеем граф g=(V,X). Пусть Т – подмножество ребер графа g, которое вначале пустое. Добавим к Т первое попавшееся ребро, если оно не образует цикл с уже имеющимися в Т ребрами. Продолжим процесс до исчерпания подходящих ребер. Если после завершения процесса число ребер в Т равно n-1, тогда граф g связный.
Алгоритм Прима (Prim)
Пусть имеем граф g=(V,X). Пусть Т – подмножество его ребер вместе с конечными вершинами, которое вначале пустое. Добавим к Т первое попавшееся ребро. Далее, будем добавлять к Т ребро, одна вершина котрого находится в Т, а другая за пределами Т. Если по завершении процесса число ребер в Т равно n-1, граф связный.
Определение связности на основе волнового процесса
Процедуру определения связности графа можно построить на основе первого волнового процесса. Выберем произвольную вершину a и будем считать, что V0={a}. Выполним разметку (индексирование) вершин на основе волнового процесса 1. Если размеченными оказались все вершины, то граф является связным.
Пусть <V0,V1,..., Vs> - разбиение множества вершин графа, получемое в результате волнового процесса и пусть vi – вершина номер i графа g, а vik – вершина, имеющая номер k в пределах подмножества Vi. Тогда анализ процедуры волнового процесса дает следующее соотношение для времени его выполнения:
,
где n – число вершин, r – число ребер, p(vik), p(vi) – степень вершины, s – количество подмножеств, порождаемых волновым процессом. Отсюда для нашего алгоритма получаем:
t = F(n) = O(r).
Таким образом, по времени выполнения, последний алгоритм имеет такую же эффективность, как и алгоритмы Крускала и Прима.
Определение компонент связности
Следующий алгоритм позволяет определить все компоненты связности графа.
1. Выбрать произвольно вершину a заданного графа g = (V,X). Полагая V0={a}выполнить волновой процесс с индексированием вершин и пусть V0,V1,..., Vs - полученная при этом последовательность подмножеств. Разделим множество вершин V на два подмножества: U1 = V0ÈVÈ,..., ÈVs и U2 = V - U1.
2. Выделить подграф g1 на подмножестве вершин U1 и подграф g2 на подмножестве вершин U2. Подграф g1 – полученный компонент связности графа g.
3. Если U2 ¹ Æ выполнить п.1 для подграфа g2, иначе – алгоритм завершить.
Дата добавления: 2015-09-27 | Просмотры: 379 | Нарушение авторских прав
|