Обходы графов. Глава 3

Содержание

Слайд 2

Существует ряд задач на графах, в которых требуется найти маршрут, который

Существует ряд задач на графах, в которых требуется найти маршрут, который

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

Одна из задач заключается в том, чтобы обойти все вершины графа

Одна из задач заключается в том, чтобы обойти все вершины графа

и в каждой из них только один раз выполнить какое-либо действие: в простейшем случае пронумеровать или пометить вершину; в более сложных случаях решить какую-либо задачу, связанную с этой вершиной. Эту задачу часто называют поиском на графе.
Слайд 4

3.1. Поиск в ширину (breadth-first search, BFS) 1. Поиск начинается с

3.1. Поиск в ширину (breadth-first search, BFS)
1. Поиск начинается с некоторой

фиксированной вершины s.
2. Последовательно просматриваются и помечаются вершины, находящиеся на расстоянии 1 от s (т.е. смежные с s).
3. k-й шаг. Просматриваются и помечаются все вершины, находящиеся на расстоянии k от s.
Процесс поиска продолжается до тех пор, пока все вершины не будут просмотрены и помечены. 
При представлении графа списком смежности сложность алгоритма составляет O(|V|+|E|).
Пример 3.1. Такая разметка применялась в алгоритме Мура – Ли.
Слайд 5

 

Слайд 6

 

Слайд 7

 

Слайд 8

3.1. Эйлеровы цепи и циклы

3.1. Эйлеровы цепи и циклы

Слайд 9

Определение. Эйлеровой цепью (циклом) называется цепь (цикл), содержащая (содержащий) все ребра

Определение. Эйлеровой цепью (циклом) называется цепь (цикл), содержащая (содержащий) все ребра

графа. Если в графе существует эйлерова цепь (цикл), то граф называется эйлеровым.

Эйлеров граф можно нарисовать одним росчерком пера.

5

3

3

3

3

3

4

2

Постановка задачи

Кенигсбергские мосты

Эйлеров граф

Слайд 10

Теорема. Эйлерова цепь (цикл) существует тогда и только тогда, когда число

 

Теорема. Эйлерова цепь (цикл) существует тогда и только тогда, когда число

вершин с нечетной валентностью равно 2 (0).

Теорема Эйлера (1736 г.)

Слайд 11

 

Слайд 12

 

 

Слайд 13

 

Слайд 14

На этом доказательстве основан алгоритм нахождения эйлеровой цепи.

 
На этом доказательстве основан алгоритм нахождения эйлеровой цепи.

Слайд 15

В 1736 г. Л.Эйлер опубликовал эту теорему, носящую в литературе его

В 1736 г. Л.Эйлер опубликовал эту теорему, носящую
в литературе его

имя, без доказательства достаточности.

Фрагмент статьи Эйлера

Слайд 16

Алгоритм Хирхольцера В 1873 г. вышла статья немецкого математика К. Хирхольцера

Алгоритм Хирхольцера

В 1873 г. вышла статья немецкого математика К. Хирхольцера
(Carl

Hierholzer, 1840 – 1871), уже после смерти автора,
содержащая конструктивное доказательство теоремы Эйлера.
C. Hierholzer: Über die Möglichkeit, einen Linienzug ohne
Wiederholung und ohne Unterbrechung zu umfahren.
Mathematische Annalen VI (1873), 30–32.
https://en.wikipedia.org/wiki/Carl_Hierholzer
https://www.youtube.com/watch?v=UgSytgwiM_A
Слайд 17

Алгоритм Хирхольцера выполняется в точном соответствии с доказательством достаточности теоремы Эйлера.

Алгоритм Хирхольцера выполняется в точном соответствии
с доказательством достаточности теоремы Эйлера.
Рассмотрим

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



Алгоритм 1.
Обозначения.
C – список, эйлеров цикл, результат работы алгоритма;
S – список, промежуточный цикл;
s – начальная вершина каждого промежуточного цикла;
x, y – текущие вершины.

Слайд 18

Шаг 0. Выбрать начальную вершину s; /* Поместить s в C

Шаг 0.
Выбрать начальную вершину s;
/* Поместить s в C

*/
Шаг 1. Выбрать в C вершину s, инцидентную еще не пройденному ребру.
Если таких вершин нет, то {Выход – C искомый эйлеров цикл}.
/* Поместить s в S */
Слайд 19

Шаг 2. /* Поиск цикла */ – /* выбрать не пройденное

Шаг 2. /* Поиск цикла */
– /* выбрать не

пройденное ребро*/.
/* Добавить y в конец списка S */
Если то на Шаг 2.
Шаг 3. /* найден цикл S */
В списке С заменить вершину s на список S;
На Шаг 1.
Слайд 20

Пример. Выберем начальную вершину и поместим ее в список C: Выполнив

Пример.

Выберем начальную вершину
и поместим ее в список C:
Выполнив нужное

число раз Шаг 2, найдем
цикл В списке C заменим вершину
1 на список S: и очистим список S:
В списке C есть вершина 2,
инцидентная еще не пройденным ребрам.
Строим новый цикл S с начальной вершиной 2:

В списке C заменим вершину 2 на список S:
и очистим список S: В списке C есть вершина 6, инцидентная еще не пройденным ребрам. Новый цикл с начальной вершиной 6 поместим в список C:
В цикле C больше нет вершин, инцидентных еще не пройденным ребрам. Это и есть нужный эйлеров цикл.

Слайд 21

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

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

n просмотров; на включение ребер в цикл понадобится еще m просмотров. Таким образом, сложность алгоритма имеет порядок
Описание и визуализацию алгоритма 1 Хирхольцера можно найти на сайте Мюнхенского технического университета
http://www-m9.ma.tum.de/graph-algorithms/hierholzer/index_en.html
Другой вариант реализации алгоритма Хирхольцера приводится в книге
Липский В. Комбинаторика для программистов: Пер. с польск.– М.:Мир, 1988. – 213 с. с илл.
Слайд 22

Алгоритм 2 [Липский]. Задан обыкновенный связный граф без вершин с нечетной



Алгоритм 2 [Липский].
Задан обыкновенный связный граф
без вершин с

нечетной степенью.
Граф задан списками смежности вершин
C – стек, эйлеров цикл, результат работы алгоритма;
S – вспомогательный стек, промежуточные циклы;
x, y – текущие вершины.
Шаг 0. /* Инициализация*/
x:= произвольная вершина графа;
/* поместить x в стек S*/
Слайд 23

Шаг 1. если то {Выход – C искомый эйлеров цикл}. /*

Шаг 1.
если то {Выход – C искомый эйлеров цикл}.
/*

Поиск цикла*/
/* := верхний элемент стека S */
если то на Шаг 2. /* Найден конец текущего цикла */
*/ и/или нет ребер инцидентных x */
/* y:=верхний элемент списка [x] */
/* Поместить y в стек S */
/* удалить ребро {x, y} из графа */
/* Удалить вершину y из списка [x] */
/* Удалить вершину x из списка [y] */
на Шаг 1;
Шаг 2. /* если [x] =*/
/*Удалить вершину x из стека S и поместить в стек C */
на Шаг 1.
Слайд 24

Пример. 3 1 4 2 5 6 3 2 4 1

Пример.

3

1

4

2

5

6

3

2

4

1

3

2

4

6

1

3

5

3

6

3

5

S

C

4

2

1


3

1

5

6

x

x

Слайд 25

 

Слайд 26

(для всех вершин, кроме s и t, полувалентности исхода и полувалентности

(для всех вершин, кроме s и t, полувалентности исхода и
полувалентности

захода равны; для вершины s
полувалентность исхода на единицу больше,
чем полувалентность захода;
для вершины t полувалентность захода на единицу больше,
чем полувалентность исхода.)
Доказательство полностью аналогично предыдущему.
Слайд 27

Задача китайского почтальона В графе с неотрицательными весами ребер найти циклический

Задача китайского почтальона

В графе с неотрицательными весами ребер найти циклический маршрут

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

3.1. Гамильтоновы цепи и циклы

3.1. Гамильтоновы цепи и циклы

Слайд 29

Постановка задачи Определение. Гамильтоновой цепью (циклом) графа называется простая цепь (простой

Постановка задачи

Определение. Гамильтоновой цепью (циклом) графа называется простая цепь (простой цикл),

содержащая (содержащий) все вершины графа.

Сэр Уильям Роуэн Гамильтон (1805-1865) – самый известный ирландский математик, один из лучших математиков 19 века. Известен фунда-ментальными открытиями в математике , механике, физике (векторный анализ, вариационное исчисление, общий прин-цип наименьшего действия в механике, теория распространения света и др.)

Слайд 30

Граф Гамильтона Додекаэдр: 12 граней, 20 вершин, 30 ребер Гамильтонов цикл

Граф Гамильтона

Додекаэдр:
12 граней,
20 вершин,
30 ребер

Гамильтонов цикл

В 1859 г. Гамильтон изобрел

голово- ломку обхода вер-шин додекаэдра
Слайд 31

Мы рассмотрим два простейших переборных алгоритма поиска гамильтоновой цепи (цикла), пригодных

 

Мы рассмотрим два простейших переборных алгоритма поиска гамильтоновой цепи (цикла), пригодных

для графов малой размерности: поиск в ширину и поиск в глубину.
Слайд 32

Поиск в ширину 2 - бесперспективное (тупиковое ) множество вариантов -

Поиск в ширину

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- бесперспективное (тупиковое ) множество вариантов

- множество вариантов стоит исследовать

глубже

Дерево вариантов

 

 

 

Слайд 33

Поиск в глубину 2 - прямой ход по дереву поиска - обратный ход (back tracking)

Поиск в глубину

 

 

2

 

 

 

 

 

 

 

 

 

 

- прямой ход по дереву поиска

- обратный ход (back

tracking)

 

Слайд 34

Задача коммивояжера Задача коммивояжера (travelling seller problem, TSP) формулируется следующим образом:

Задача коммивояжера

Задача коммивояжера (travelling seller problem, TSP) формулируется следующим образом: во

взвешенном графе (обычно – полном) найти гамильтонову цепь (цикл) наименьшей длины (с наименьшим суммарным весом ребер). Название задачи происходит от следующей формулировки: имеется n городов и известны расстояния между каждой парой городов; коммивояжер (бродячий торговец), выходящий из какого-либо города, должен посетить n − 1 других городов и вернуться в исходный. В каком порядке ему нужно посещать города, чтобы
общее пройденное расстояние было минимальным?
Слайд 35

 

Слайд 36

Пример. Столицы 48 штатов Длина пути 16675 миль. Алгоритм LMatrix http://lmatrix.ru/news/problems

Пример. Столицы 48 штатов

Длина пути 16675 миль. Алгоритм LMatrix

http://lmatrix.ru/news/problems