Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТСД. Лекции Силантьевой / лекция_граф_3_14

.doc
Скачиваний:
52
Добавлен:
10.02.2015
Размер:
153.09 Кб
Скачать

ЭЙЛЕРОВЫ ПУТИ И ЦИКЛЫ.

Произвольный путь в графе, проходящий через каждое ребро графа точно один раз, называется ЭЙЛЕРОВЫМ ПУТЕМ. (По вершинам путь может проходить неоднократно, то есть путь может быть не простой). Это значит, что в пути v(1)-v(2)-...-v(m+1) каждое ребро графа появляется один и только один раз как { v(i),v(i+1) } для некоторого i. Если при этом v(1)=v(m+1), то имеем ЭЙЛЕРОВ ЦИКЛ.

Для существования эйлерова пути в связном графе необходимо и достаточно, чтобы граф содержал не более 2 вершин нечетной степени.

В алгоритме поиска эйлерова цикла связный граф G=<V,E> описан двунаправленным списками ZAP[v], а эйлеров цикл представлен последовательностью вершин в рабочем стеке ST; стек SE содержит последовательность полностью обработанных вершин.

Procedure EULER;

Begin

ST <-- 0; SE <-- 0;

v <-- произвольная вершина графа G;

ST <-- v; {помещаем ее в рабочий стек ST }

While ST<>0 do {пока стек не пуст}

Begin

v <-- upper(ST); {в v - верхний элемент рабочего стека}

If ZAP[v]<>0 {если есть смежные вершины с v}

Then

Begin

u <-- 1-я вершина списка ZAP[v]; {помещаем 1-ю из списка в u}

ST <-- u; {ее помещаем в раб. стек}

ZAP[v] <-- ZAP[v] \ {u}; {удаление ребра v--u из списка для v}

ZAP[u] <-- ZAP[u] \ {v}; {удаление ребра v--u из списка для u}

v<--u {проверяем следующую вершину}

End

Else {иначе, список ZAP[v] пуст}

Begin

v <-- ST; { удаляем вершину v из стека ST}

SE <-- v { помещаем ее в стек SE }

End

End

End.

Сначала выбирается произвольная вершина v. Если есть нечетные, то одна из них.

Вершины с нечетной степенью должны быть конечными (можно их перенумеровать).

В цикле по условию опустошения стека ST строится путь с началом в v.

Вершины строящегося пути размещаются в ST, ребра, входящие в путь, удаляются из графа (соответствующие элементы удаляются из списков ZAP).

Двунапрнавленность списков инцидентности ZAP[v] позволяет устранить ребро {v,u} за время, ограниченное константой. Общая сложность алгоритма: O(m), где m – количество ребер графа.

4

Для графа

1

3

5

–> 2, 3

2

14

-> 1, 3, 7, 8

3

13

12

11

-> 1, 2, 4, 5

4

15

6

-> 3, 5

5

2

-> 3, 4, 6, 8

6

8

10

7

-> 5, 7, 8, 9

7 -> 2, 6, 8, 9

8

1

9

-> 2, 5, 6, 7

9 -> 6, 9

один из найденных эйлеровых циклов представлен последовательностью вершин: 1–2 –3 – 4 – 5 – 6 –7– 2 – 8 – 6 – 9 –7 – 8 – 5 –3 – 1. ST –Эйлеров путь

SE 4 – 2 – 7 - 9 – 6 – 8 – 5 – 3 – 1 - последов. обработанных вершин

Гамильтоновы пути в графе (алгоритмы с возвратом)

Пусть - некоторый граф. Он называется гамильтоновым, если в нем существует простой цикл, содержащий все вершины графа. Например, каждый полный граф – гамильтонов, потому что в нем проведены всевозможные ребра и, в частности, те, благодаря кот. возможен обход по всем вершинам. А вот пример графа, не являющегося гамильтоновым:

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

Рассмотрим построение путей в графе, проходящих в точности один раз через каждую вершину (а не каждое ребро) графа. Такой путь и соответствующий цикл называются Гамильтоновыми и существуют не для каждого графа, как и Эйлеров путь. Например, в графе:

1 –> 2, 3

2 –> 1, 3, 4, 5

3 –> 1, 2, 6

4 –> 2, 6

5 -> 2, 6, 7

6 -> 3, 4, 5, 7

7 -> 5,6

есть гамильтонов путь 1, 3, 2, 4, 6, 5, 7. В то же время в графе

1 -> 2, 3, 4

2 -> 1, 5

3 -> 3, 5

4 -> 1, 5

5 -> 2, 3, 4, 6

6 -> 5

гамильтонова пути не существует.

В отличие от эйлеровых путей неизвестно ни одного простого необходимого и достаточного условия для существования гамильтоновых путей.

. Условия Дирака, Оре и Поша, гарантирующие существование в графе гамильтонова цикла.

условие Дирака. Пусть - число вершин в данном графе; если степень каждой вершины не меньше, чем , то граф называется графом Дирака. Можно доказать, что каждый граф Дирака обязательно гамильтонов.

пример графа Дирака:

Очевидно, этот граф - гамильтонов. А вот пример гамильтонова графа, не являющегося графом Дирака:

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

пример графа Оре:

пример графа, не являющегося графом Оре, но граф гамильтонов:

Нетрудно заметить, что всякий граф Дирака автоматически является графом Оре. Но вот пример графа Оре, не являющегося графом Дирака:

условие Поша.. Введем следующую функцию целого неотрицательного аргумента . Сначала запишем определение формулой, речь идет о графе ,

для которого строится функция :

;

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

Такую функцию называют функцией Поша графа .

построим функцию Поша следующего графа:

Функция будет описана таблично:

X

0

1

2

3

4

5

...

f(x)

0

1

3

4

4

4

...

Теперь сформулируем условие Поша.

Графом Поша называется граф , удовлетряющий следующим условиям (число вершин этого графа обозначим через , его функцию Поша обозначим через , будет обозначать целое число):

1) для выполняется неравенство ;

2) если - целое число, то при имеет место неравенство: .

Можно доказать, что каждый граф Поша обязательно гамильтонов. Легко заметить, что простой цикл на большом числе вершин, графом Поша не является, но, конечно, явяляется га-мильтоновым графом.

Кр. того, нетрудно заметить, что всякий граф Дирака является графом Поша, каждый граф Оре является графом Поша. Обратное в обоих последних случаях неверно. Вот пример: фиксируем какой-нибудь полный граф на достаточно большом числе вершин; добавим к нему еще одну вершину и соединим ее с любыми двумя вершинами в исходном графе; очевидно, вновь полученный граф - гамильтонов; фиксируем в нем к.-н. гамильтонов цикл и удалим из графа какое-нибудь ребро, не включенное в этот цикл; полученный в результате граф будет, как нетрудно проверить, графом Поша; однако, он не будет графом Оре - будут сразу две пары несмежных вершин, сумма степеней которых меньше числа вершин в графе.

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

Т.е. полный перебор, т.е. n!*n шагов. Для сокращения перебора был разработан класс алгоритмов «с возвратом» (backtracking).

Рассмотрим алгоритм поиска всех гамильтоновых циклов в графе (в глобальном векторе X строится последовательность вершин X[1],…X[k-1] строящегося пути; логический вектор DOP показывает, можно ли вставить вершины в проектируемый путь, n – кол-во вершин графа):

Procedure Ham(k); {}

Begin

For uZAP[X[k-1]] do

If (k=n+1) {если все вершины уже вставлены в путь}

And (u=v0) {и если последняя в-на в пути совпадает с 1-ой}

{т.е. это цикл}

Then Write(X[1],…X[k-1],v0) {печать пути и возможное окончание

алгоритма}

Else

If DOP[u] {если вершину можно вставить в путь}

Then

Begin

X[k]  u; DOP[u]  False;

If k<= n Then

Ham(k+1); {очередное удлинение пути привело в тупик –}

Else

DOP[u]  True;

{необходимо вернуться для следующей попытки}

End;

End; {Ham}

Begin

For vV do DOP[v]  True; {инициализация}

X[1]  v0; {v0 – произвольная фиксированная вершина графа}

DOP[v0]  False;

Ham(2); {начало построения пути длиной 2}

End.

Этот рекурсивный алгоритм имеет сложность не более чем exp(n)

Работу этого алгоритма можно проиллюстрировать процессом поиска в некотором дереве, состоящем из всех возможных последовательностей <x1,…,xk> для графа.