Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1_2_Vosstanovlen.docx
Скачиваний:
50
Добавлен:
19.12.2018
Размер:
520.19 Кб
Скачать

23. Эйлеровы и полуэйлеровы графы. Алгоритм построения эйлерова цикла в эйлеровом графе.

Чтобы иметь возможность обойти весь граф, пройдя ровно по одному разу каждое ребро, и вернуться в исходное положение, нужно в каждую вершину заходить по одному ребру, а выходить по другому. Т. Е. степени всех вершин должны быть четны. Граф должен быть связан. Вот такой граф - эйлерова графа, а сам цикл, включающий каждое ребро графа ровно один раз, - эйлерова цикла.

Теорема Эйлера. Граф G является эйлеровым тогда и только тогда, когда он связен и все степени его вершин четны. Практическим примером построения эйлерова цикла является задача о развозе почты. Но эйлеровых графов среди всех возможных графов на p вершинах не так уж много Как покрыть некоторый граф минимальным количеством цепей, чтобы каждое ребро входило в это покрытие только один раз? Задача может возникнуть в ГИС как проблема оптимального описания векторного слоя. Кроме того, может оказаться, что, хотя эйлерова цикла в графе нет, его все равно можно полностью обойти. Например(рис.3.24).

В этом графе есть две вершины степени три. Их можно соединить условной дугой, и тогда граф станет эйлеровым. Построим в нем эйлеров цикл и удалим из него условную дугу. Получим цепь, в которую каждое ребро графа входит ровно один раз. Такой граф называется полуэйлеровым, а сама цепь – эйлеровой цепью.

Теорема. Пусть G – связный граф с k вершинами нечетной степени. Тогда минимальное количество непересекающихся по ребрам цепей, покрывающих G, равно k/2. В графе число вершин нечетной степени четно. Соединим все такие вершины попарно, как на рис. 3.24. Такой дополненный граф будет эйлеровым, и в нем можно построить эйлеров цикл. Удалив после построения ребра, получим искомые k/2 простых цепей. Самым древним примером задачи на построение эйлерова цикла является арабская головоломка про сабли Магомета. В ней предлагается, не отрывая руки, обрисовать следующую конструкцию (рис.3.25). Эйфелев граф получается при любом положении сабель, главное – чтобы они пересекались. Т.е.задача всегда имеет решение.

Пронумеруем вершины и составим список смежности этого мультиграфа:

1) 2,10 6) 5,7

2) 1,3,3,10 7) 5,6,8,8

3) 2,2,4,5 8) 7,7,9,10

4) 3,5 9) 8,10

5) 3,4,6,7 10) 1,2,8,9.

Далее список смежности будем называть рабочим списком. Действовать будем следующим образом. Берем первую по порядку вершину и переходим в первую из ее списка смежности, в данном случае в вершину 2. Включаем этот переход в цикл: CE=(1,2). Ребро (1,2) исключаем из списка, а вершину 1 вместе с оставшимся элементом списка смежности, то есть еще возможным переходом, кладем в так называемый стек. Стек – это список, перевернутый «вверх ногами», что-то вроде стакана, из которого в первую очередь надо брать то, что лежит сверху, то есть пришло в него последним.

После выполненного шага имеем:

Рабочий список:

2) 3,3,10 7) 5,6,8,8 Список стека:

3) 2,2,4,5 8) 7,7,9,10 1) 10.

4) 3,5 9) 8,10

5) 3,4,6,7 10) 1,2,8,9.

6) 5,7

Делаем следующий шаг: переходим в вершину 3. Добавляем ребро (2,3) в цикл: CE=(1,2,3), удаляем его из списка, а вершину 2 с оставшимися переходами кидаем в стек.

Рабочий список:

3) 2,4,5 8) 7,7,9,10 Список стека:

4) 3,5 9) 8,10 2) 3,10

5) 3,4,6,7 10) 1,2,8,9. 1) 10.

6) 5,7

7) 5,6,8,8

Переходим из вершины 3 в ту вершину, которая еще есть в текущем списке, то есть в вершину 4. Повторяем все предыдущие действия и получаем:CE=(1,2,3,4).

Рабочий список:

4) 5

5) 3,4,6,7

6) 5,7

7) 5,6,8,8

8) 7,7,9,10

9) 8,10

10) 1,2,8,9.

Список стека:

3) 2,5

2) 3,10

1) 10.

Из вершины 4 возможен только один переход, поэтому в стек сбрасывать нечего. Переходим в вершину 5: CE=(1,2,3,4,5). Стек остается прежним, а рабочий список выглядит так:

5) 3,6,7

6) 5,7

7) 5,6,8,8

8) 7,7,9,10

9) 8,10

10) 1,2,8,9.

После перехода в вершину 6 имеем: CE=(1,2,3,4,5,6).

Рабочий список:

6) 7

7) 5,6,8,8

8) 7,7,9,10

9) 8,10

10) 1,2,8,9.

Список стека:

5) 3,7

3) 2,5

2) 3,10

1) 10.

Теперь переходим в вершину 7: CE=(1,2,3,4,5,6,7).

Список стека не меняется, а рабочий список имеет вид:

7) 5,8,8

8) 7,7,9,10

9) 8,10

10) 1,2,8,9.

Переходим в вершину 8: CE=(1,2,3,4,5,6,7,8).

Рабочий список:

8) 7,9,10

9) 8,10

10) 1,2,8,9.

Список стека:

7) 5,8

5) 3,7

3) 2,5

2) 3,10

1) 10.

Переходим в вершину 9: CE=(1,2,3,4,5,6,7, 8,9).

Рабочий список:

9) 10

10) 1,2,8,9.

Список стека:

8) 7,10

7) 5,8

5) 3,7

3) 2,5

2) 3,10

1) 10.

Переходим в вершину 10: CE=(1,2,3,4,5,6,7,8,9,10). Список стека не меняется. В рабочем списке остается одна вершина: 10) 1,2,8. Брать из рабочего списка больше нечего, поэтому обращаемся к стеку, из которого мы будем брать в первую очередь то, что лежит выше. В данном случае мы должны брать вершину 8: CE=(1,2,3,4,5,6,7,8,9,10,8). После этого шага рабочим становится список стека:

10) 1,2

8) 7

7) 5,8

5) 3,7

3) 2,5

2) 3,10

1) 10

Из вершины 8 мы можем перейти только в 7, поэтому вершина 8 вообще уходит. Имеем:

CE=(1,2,3,4,5,6,7, 8,9,10,8,7).

Рабочий список:

10) 1,2

7) 5

5) 3,7

3) 2,5

2) 3,10

1) 10.

Из вершины 7 мы можем перейти только в 5: CE=(1,2,3,4,5,6,7, 8,9,10,8,7,5).

Рабочий список:

10) 1,2

5) 3

3) 2,5

2) 3,10

1) 10.

Далее переходим в 3: CE=(1,2,3,4,5,6,7, 8,9,10,8,7,5,3).

Рабочий список:

10) 1,2 2) 3,10

3) 2 1) 10.

Переходим в 2: CE=(1,2,3,4,5,6,7, 8,9,10,8,7,5,3,2).

Рабочий список:

10) 1,2

2) 10

1) 10.

Переходим в 10: CE=(1,2,3,4,5,6,7, 8,9,10,8,7,5,3,2,10).

Получаем:

10) 1

1) 10.

Остался только один переход, и цикл завершен: CE=(1,2,3,4,5,6,7, 8,9,10,8,7,5,3,2,10,1).