Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii-DM-Logika-Grafy.pdf
Скачиваний:
93
Добавлен:
30.05.2015
Размер:
1.71 Mб
Скачать

224

Глава 7. Связность графов

 

 

2. °) Необходимость. Если x и y взаимодостижимы, то для любой вершины z 2 X, ввиду транзитивности отношения взаимодостижимости, из z 2 D(x) следует z 2 D(y), а из z 2 D(y) следует z 2 D(x), поэтому D(x) = D(y). £

7.3.1 Нахождение компонент и бикомпонент

Рассмотрим матрицу смежности R графа G над булевой алгеброй Bf0; 1g; обозначим через E единичную матрицу порядка n(G) и образуем последовательность матриц

E + R; (E + R)2; : : : ; (E + R)l,

элементы которых отражают наличие маршрутов (ормаршрутов) длины не более l. Для некоторого l0 (а именно для цепи (пути) наибольшей длины) выполняется условие

(E + R)l0 = (E + R)l+1 = (E + R)l0+2 = : : : .

Каждой системе одинаковых строк (или столбцов) “установившейся” матрицы соответствует компонента (бикомпонента) связности.

Введем еще несколько терминов, которые понадобятся нам в дальнейшем.

Перешеек (точка сочленения или шарнир) – это ребро (вершина), при удалении которого (которой) число компонент связности увеличивается на 1.

Максимальный связный подграф, не имеющий своих точек сочленения, называется блоком графа.

Соответственно могут быть поставлены задачи нахождения перешейков, точек сочленения (шарниров), блоков.

7.4Кратчайшие цепи

Вэтом pазделе pассматpивается несколько алгоpитмов нахождения кpатчайших цепей между заданной паpой веpшин, а также между всеми паpами веpшин гpафа.

7.4. Кратчайшие цепи

225

 

 

 

7.4.1Алгоритм нахождения кратчайших цепей между заданными вершинами

Пусть задан граф G = (X; U; P ) . Требуется найти кратчайшие цепи, соединяющие вершины s и t.

Описание алгоритма.

Шаг 1. Помечаем вершину s меткой 0.

Шаг 2. Меткой k+1 помечаем каждую вершину, которая еще не помечена и смежна хотя бы с одной вершиной, помеченной меткой k. Разметка прекращается, как только вершина t окажется помеченной некоторой меткой l.

Шаг 3. Сама кратчайшая цепь длины l отыскивается следующим образом. Начинаем с вершины t. За x1 берем любую вершину с меткой l ¡ 1 и смежную с t, а за ul – любое ребро, соединяющее x1 с t. За x2 выбираем любую вершину, помеченную меткой l ¡ 2 и смежную с x1, а за u1 – любое ребро, соединяющее x2 с x1 и так далее, пока не дойдем до вершины s. £

Доказательство того, что цепь действительно кратчайшая, аналогично доказательству оптимальности алгоритма Дейкстры (смотри ниже).

Задача о нахождении кратчайших циклов, содержащих данное ребро u, сводится к предыдущей: достаточно удалить ребро u из G и в оставшемся суграфе найти кратчайшие цепи между вершинами x и y, которые в G были соединены ребром u.

Пример 7.6.

Найти кратчайшую цепь между вершинами s и t.

a 1

b 1

c 2

 

 

s 0

 

g 2 t 3

 

 

d 1

 

 

 

e 1

f 2

На рисунке буквами помечены вершины, цифрами – соответствующие метки вершин. Начиная с вершины t отыскиваем крат-

226

Глава 7. Связность графов

 

 

чайшую цепь (по вершинам) [t g b s] или [t g e s]. В прямом направлении им соответствуют цепи [s b g t] и [s e g t]; обе эти цепи – кратчайшие; длина кратчайшей цепи равна 3. J

7.4.2Кратчайшая цепь между заданными вершинами (взвешенный граф)

Пусть задан граф G = (X; U) и отображение f : U 7!C, ставящее в соответствие каждому ребру u, соединяющему пару вершин xi; xj, число cij – вес или длину ребра. Таким образом, задается матрица весов ребер C = kcijk, размерности n £ n.

Если последовательность вершин и ребер

su1x1u2 : : : x1ult

есть маршрут, соединяющий вершины s и t, то длина маршрута определяется как

c(s; t) = Pl cuk ,

k=1

где cuk = c(xi; xj) = cij; cij – вес ребра, соединяющего вершины xi; xj; рассматривается случай cij ¸ 0.

З а м е ч а н и В. данной задаче имеет смысл рассматривать униграф, так как если пару вершин xi; xj соединяет более чем одно ребро, можно заранее выбрать из них ребро с наименьшим весом.

I

Требуется найти кратчайший по длине маршрут (а мы показали, что это цепь), соединяющий вершины s и t.

Алгоритмы, приводимые ниже, используют разметку вершин. Составная метка при вершине x имеет вид L(x) = [p; l(x)], где p – метка предшествования, а l(x) – метка расстояния вершины x от s.

7.4.3 Алгоритм Форда

Шаг 0. Инициализация.

Назначим вершине s метку L(s) = [s; 0]. Для всех вершин x, отличных от s, x 6= s назначим метки L(x) = [x; 1].

Шаг 1. Разметка вершин. Основной цикл. Находим такое ребро (x; y), для которого

l(y) ¡ l(x) > c(x; y)

и заменяем метку вершины y на L0(y) = [x; l(x) + c(x; y)]. При этом метка l0(y) = l(x) + c(x; y) может только уменьшиться:

l0(y) < l(y) и l0(y) > 0 при y 6= s.

7.4. Кратчайшие цепи

227

 

 

 

Этот процесс продолжаем до тех пор, пока имеется хотя бы одно ребро, для которого можно уменьшить метку.

Шаг 2. Нахождение кратчайшей цепи.

После того как метки установятся, то есть не найдется больше ни одной вершины y, для которой можно уменьшить метку l(y), приступаем к построению кратчайшей цепи.

Начинаем с вершины t. Если ее метка есть [xk; l(t)], то xk есть вершина в искомой цепи, предшествующая t; при этом l(t) = l(xk)+ c(xk; t).

Далее итеративно: если метка вершины xk есть [x1; l(xk)], то x1 есть вершина в искомой цепи, предшествующая xk и

l(xk) = l(x1) + c(xk; t)

В самом деле, метка l(t) в процессе разметки уменьшалась, а xk – последняя вершина, от которой уменьшалась метка l(t). Точно так же, найдется вершина x1, для которой

l(xk) = l(x1) + c(x1; xk) и так далее.

Последовательность l(t); l(xk); l(x1); : : : строго убывающая, поэтому в некоторый момент будет x0 = s.

Теорема 7.3 l(t) – длина кратчайшего маршрута из s в t и

M = [s = x0; : : : ; x1; xk; : : : ; t]

этот кратчайший маршрут.

Д о к а з а т е л ь с т в о . Пусть в размеченном с помощью алгоритма графе имеется произвольный маршрут

s = x0; xk1 ; xk2 ; : : : ; xkn = t

длины c(s; t). Тогда

l(xk1 )

¡

0

·

c(x0; xk1 );

l(xk2 )

¡

l(xk1 )

·

c(xk1 ; xk2 );

 

: : :

: : :

: : :

l(xkn ) ¡ l(xk1 ) · c(xk1 ; xkn )

Просуммировав левые и правые части неравенств, получим:

l(xkn ) ¡ 0 ·

c(x0; xkn ) = c(s; t);

l(t)

·

c(s; t):

Таким образом, длина произвольного маршрута не меньше длины маршрута, полученного с помощью алгоритма; следовательно, этот маршрут – кратчайший. £

228 Глава 7. Связность графов

Пример 7.7.

Найти кратчайший маршрут из вершины 1 в вершину 6.

 

2

7

3

5

 

10

 

2

 

 

 

 

8

 

 

1

 

 

 

 

6

2

 

 

3

1

6

9

4

 

5

Матрица весов (расстояний)

 

 

 

C

1

2

3

4

5

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

0

10

1

1

1

1

 

C =

 

2

 

10

0

7

2

2

1

 

 

3

 

1

7

0

8

3

5

 

 

 

 

 

 

 

 

 

4

 

1

2

8

0

3

1

 

 

 

 

5

 

1

2

3

6

0

9

 

 

 

 

6

 

1

1

5

1

9

0

 

Массив меток L = [p; l(x)]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

2

 

 

3

4

 

 

5

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1, 0

 

2, 1

 

3, 1

4, 1

 

 

5, 1

6, 1

1

 

1, 0

 

1, 10

 

3, 1

1, 1

 

 

5, 1

6, 1

2

 

1, 0

 

1, 10

 

2, 17

1, 1

 

 

2, 12

6, 1

4

 

1, 0

 

4, 3

 

 

4, 9

1, 1

 

 

4, 7

6, 1

5

 

1, 0

 

4, 3

 

 

4, 9

1, 1

 

 

4, 7

5, 16

2

 

1, 0

 

4, 3

 

 

4, 9

1, 1

 

 

2, 5

5, 16

5

 

1, 0

 

4, 3

 

 

5, 8

1, 1

 

 

2, 5

5, 16

3

 

1, 0

 

4, 3

 

 

5, 8

1, 1

 

 

2, 5

3, 13

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Цифры в столбце слева от массива меток показывают начальную вершину x, цифра в строке на верху таблицы – конечную вершину y ребра (x; y), выбранного для разметки. Таким образом, длина кратчайшего маршрута равна 13, а сам маршрут, начиная

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]