Алгоритмы и структуры...

Post on 01-Aug-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Алгоритмы иструктуры данных

Лекция 7. Графы.

(с) Глухих Михаил Игоревич, glukhikh@mail.ru

Граф = вершины (узлы) + рёбра (дуги)

Вершины и рёбра могут иметь свойства

2 Граф

Схемы, связи, иерархии, карты, ...

сети автомобильных дорог

схемы метро

компьютерные сети

логические схемы

схемы лабиринтов

карты дорог

...

3 Применение графов впрограммировании

Определение расстояния между вершинами

4 Типичная задача на графе

Определение расстояния между вершинами

5 Типичная задача на графе

15

20

15

10

15

15

5

Разновидности графов

Взвешенный (с весом рёбер)

6

Разновидности графов

Взвешенный (с весом рёбер)

Ориентированный / неориентированный

7

Разновидности графов

Взвешенный (с весом рёбер)

Ориентированный / неориентированный

Мультиграф (с кратными рёбрами)

8

Разновидности графов

Взвешенный (с весом рёбер)

Ориентированный / неориентированный

Мультиграф (с кратными рёбрами)

Дерево (без циклов)

9

Представление графа

В виде списка смежных вершин

10

Представление графа

В виде списка смежных вершин

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

11

Представление графа

В виде списка смежных вершин

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности

12

Представление графа

В виде списка смежных вершин

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности

Строки и столбцы = вершины, ячейки = дуги

13

Представление графа

В виде списка смежных вершин

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности

Строки и столбцы = вершины, ячейки = дуги

Что требует больше места?

14

Представление графа

В виде списка смежных вершин O(V) + O(E)

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности O(V2)

Строки и столбцы = вершины, ячейки = дуги

Что требует больше места?

15

Представление графа

В виде списка смежных вершин O(V) + O(E)

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности O(V2)

Строки и столбцы = вершины, ячейки = дуги

Что требует больше места?

Что всё же выгоднее?

16

Представление графа

В виде списка смежных вершин O(V) + O(E)

То есть, для каждой вершины храним список соседей(и сопутствующую информацию)

В виде матрицы смежности O(V2)

Строки и столбцы = вершины, ячейки = дуги

Что требует больше места?

Что всё же выгоднее?

0 <= E <= V2

17

Интерфейс «Граф» на Java (пример)

public interface Graph {

interface Vertex {

String getName();

}

Set<Vertex> getVertices();

Set<Vertex> getNeighbors(Vertex v);

// Optional, for weighted graph

interface Edge {

int getWeight();

}

Map<Vertex, Edge> getConnections(Vertex v);

}

18

Обход графа

Поиск в ширину (BFS, Breadth-First Search)

Проверяем вершины последовательно по возрастанию пути до них

Поиск в глубину (DFS, Depth-First Search)

Проверяем каждый путь, пока не встретим тупик / кольцо

19

Обход графа

Поиск в ширину (BFS, Breadth-First Search)

Проверяем вершины последовательно по возрастанию пути до них

Поиск в глубину (DFS, Depth-First Search)

Проверяем каждый путь, пока не встретим тупик / кольцо

NB: искать мы можем, в общем случае, что угодно!

20

Обход графа

Поиск в ширину (BFS, Breadth-First Search)

Проверяем вершины последовательно по возрастанию пути до них

Поиск в глубину (DFS, Depth-First Search)

Проверяем каждый путь, пока не встретим тупик / кольцо

NB: искать мы можем, в общем случае, что угодно!

Пример (лишь пример!): поиск пути в графе

21

Поиск в ширину: псевдокод

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (visit = NOT_VISITED, prev = null)

info[s] = (VISITED, null)

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE()

for (v in neighbors(u)):

if (info[v].visit = NOT_VISITED):

info[v] = (VISITED, prev = u)

ENQUEUE(v)

22

Поиск в ширину: трудоёмкость

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (visit = NOT_VISITED, prev = null)

info[s] = (VISITED, null)

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE() // V iterations

for (v in neighbors(u)):

if (info[v].visit = NOT_VISITED): // E iterations

info[v] = (VISITED, prev = u)

ENQUEUE(v)

// Total: O(V+E)

23

Поиск пути в ширину: псевдокод

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (visit = NOT_VISITED, distance = INF, prev = null)

info[s] = (VISITED, distance = 0, null)

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE()

for (v in neighbors(u)):

if (info[v].visit = NOT_VISITED):

info[v] = (VISITED, distance = info[u].distance + 1, prev = u)

ENQUEUE(v)

24

Поиск в ширину: что меняется, еслиграф взвешенный?

25

26 Поиск в ширину: что меняется, еслиграф взвешенный?

15

20

15

10

15

15

5

Поиск в ширину: алгоритм Дейкстры

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (distance = INF, prev = null)

info[s] = (0, null); visited = ()

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE() // with shortest distance (greedy)

visited.add(u)

for (v in neighbors_not_visited(u))

if (info[v].distance > info[u].distance + distance(u, v)):

info[v] = (info[u].distance + distance(u, v), prev = u)

ENQUEUE(v) // replacing previous (v) if necessary

27

Алгоритм Дейкстры: трудоёмкость

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (distance = INF, prev = null)

info[s] = (INF, null)

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE() // V iterations

visited.add(u)

for (v in neighbors_not_visited(u)) // E iterations

if (info[v].distance > info[u].distance + distance(u, v)):

info[v] = (info[u].distance + distance(u, v), prev = u)

ENQUEUE(v)

28

Алгоритм Дейкстры: трудоёмкость

BFS(G = (V, E), s in V):

for (v in V):

info[v] = (distance = INF, prev = null)

info[s] = (INF, null)

ENQUEUE(s)

while (QUEUE is not empty):

u = DEQUEUE() // V iterations, ~ log(V) each (heap in use)

visited.add(u)

for (v in neighbors_not_visited(u)) // E iterations

if (info[v].distance > info[u].distance + distance(u, v)):

info[v] = (info[u].distance + distance(u, v), prev = u)

ENQUEUE(v) // ~ log(V) each

// Total: (V+E)logV

29

Очередь с приоритетами

(with shortest distance…)

Java: PriorityQueue

Вариант реализации: binary heap

30

Очередь с приоритетами

(with shortest distance…)

Java: PriorityQueue

Вариант реализации: binary heap (двоичная куча)

Вершина с минимальной дистанцией хранится на вершине кучи

Добавление и удаление – за O(logV)

31

Волновой алгоритм

Он же алгоритм Ли

= Поиск пути на планарном графена основе поиска в ширину

32

Волновой алгоритм

Он же алгоритм Ли

= Поиск пути на планарном графена основе поиска в ширину

Планарный граф = тот, который можно нарисовать на плоскостибез пересечений рёбер

33

Волновой алгоритм

Он же алгоритм Ли

= Поиск пути на планарном графена основе поиска в ширину

Планарный граф = тот, который можно нарисовать на плоскостибез пересечений рёбер

Трудоёмкость = обычный поиск пути в ширину(на графе без весов)

34

Волновой алгоритм35

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

36

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

Отличие: в порядке обхода вершин

Дейкстра: критерием является расстояние от старта

37

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

Отличие: в порядке обхода вершин

Дейкстра: критерием является расстояние от старта

A*: критерием является расстояние до старта + расстояние до финиша

38

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

Отличие: в порядке обхода вершин

Дейкстра: критерием является расстояние от старта

A*: критерием является расстояние до старта + расстояние до финиша

?! Его же ещё надо найти ?!

39

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

Отличие: в порядке обхода вершин

Дейкстра: критерием является расстояние от старта

A*: критерием является расстояние до старта + расстояние до финиша

?! Его же ещё надо найти ?!

Рассчитанное эвристически…

40

Алгоритм A-Star (A*)

Поиск кратчайшего пути, улучшение алгоритма Дейкстры

Даёт возможность посетить меньше вершин

Отличие: в порядке обхода вершин

Дейкстра: критерием является расстояние от старта

A*: критерием является расстояние до старта + расстояние до финиша

?! Его же ещё надо найти ?!

Рассчитанное эвристически…

На прямоугольном поле: (разница по ширине + разница по высоте)

41

Алгоритм A-Star (A*)

Эвристика: оценка расстояния от текущей вершины доконечной вершины

Требования

Оценка снизу (реальное расстояние >= оценки)

Неравенство треугольника

Иначе можем пропустить оптимальное решение

42

Алгоритм Беллмана-Форда

Тоже ищет кратчайшие пути в графе

Допускает рёбра с отрицательным весом (но в графе недолжно быть отрицательных циклов)

O(VE)

Перебор всех рёбер V-1 раз с обновлением оптимальныхрасстояний, если они есть

Применение: в основном маршрутизация сетей в условияхнеполной информации

43

Поиск в глубину: псевдокод

DFS(G = (V, E), s in V):

for (v in V):

info[v] = (NOT_VISITED, prev = null)

DFS-VISIT(G, s, info, prev = null)

DFS-VISIT(G = (V, E), v in V, info, prev):

info[v] = (VISITED, prev = prev)

for (u in neighbors(v)):

if (info[u] NOT_VISITED):

DFS-VISIT(G, u, info, prev = v)

44

Поиск в глубину: трудоёмкость

DFS(G = (V, E), s in V):

for (v in V):

info[v] = (NOT_VISITED, prev = null)

DFS-VISIT(G, s, info, prev = null)

DFS-VISIT(G = (V, E), v in V, info, prev): // V calls

info[v] = (VISITED, prev = prev)

for (u in neighbors(v)):

if (info[u] NOT_VISITED): // Total E iterations

DFS-VISIT(G, u, info, prev = v)

45

Поиск пути в глубину: псевдокод

DFS(G = (V, E), s in V):

for (v in V):

info[v] = (distance = INF, prev = null)

DFS-VISIT(G, s, info, depth = 0, prev = null)

DFS-VISIT(G = (V, E), v in V, info, depth, prev):

info[v] = (distance = depth, prev = prev)

for (u in neighbors(v)):

if (info[u].distance > depth + 1):

DFS-VISIT(G, u, info, depth = depth + 1, prev = v)

46

Поиск пути: что лучше?

В ширину / В глубину?

47

Поиск пути: что лучше?

В ширину / В глубину?

Для невзвешенного графа ~ без разницы: O(V) + O(E)

48

Поиск пути: что лучше?

В ширину / В глубину?

Для невзвешенного графа ~ без разницы: O(V) + O(E)

Для взвешенного графа алгоритм Дейкстры даёт O((V+E)logV)

49

Поиск пути: что лучше?

В ширину / В глубину?

Для невзвешенного графа ~ без разницы: O(V) + O(E)

Для взвешенного графа алгоритм Дейкстры даёт O((V+E)logV)

Что может дать (для взвешенного графа) поиск в глубину?

50

Поиск пути: что лучше?

В ширину / В глубину?

Для невзвешенного графа ~ без разницы: O(V) + O(E)

Для взвешенного графа алгоритм Дейкстры даёт O((V+E)logV)

Что может дать (для взвешенного графа) поиск в глубину?

Нам придётся смотреть одни и те же вершины / рёбранесколько раз…

51

Применение поиска в глубину

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

52

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

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

0 5

10

15

30

1040

5

1525

20

1 2

43

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

Варианты формулировки

Классическая: граф полносвязный(каждая вершина связана с каждой)

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

54

Задача коммивояжёра: точное решение

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

Запоминаем самый короткий маршрут

Отсечение: останавливаем текущую ветку поиска вглубину, если её длина уже превысила длину самогокороткого маршрута

55

56 Перебор вариантов

0

1

0 2 3

5

10

15

30

1040

5

1525

20

1 2

43

0

57 Перебор вариантов

0

1

0 2

1 4

2

10

25

55 30

35 4555

5

53

?? ??

40

70

3

95

0

115

58 Перебор вариантов

0

1

0 2 3

011 4

2

10

25 20

55 30

35 4555

45

40

5

53

?? ??

40

70

3

95

0

115

4

5 2

60 50

52

90 80

0

120

59 Перебор вариантов

0

1

0 2 3

011 4

2

10

25 20

55 30

35 4555

45

40

5

53

?? ??

40

70

3

95

0

115

4

5 2

60 50

52

90 80

0

120

3

20

1 430

45

2 2 5

45 5060

4

50

5

65

0105

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

Почему не поиск в ширину?

60

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

Почему не поиск в ширину?

Очередь может быстро увеличиваться в размерах

61

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

Почему не поиск в ширину?

Очередь может быстро увеличиваться в размерах

Трудоёмкость решения

62

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

Почему не поиск в ширину?

Очередь может быстро увеличиваться в размерах

Трудоёмкость решения

O(V!)

Классический пример задачи без быстрого решения

По-научному: NP-полная задача

63

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

Почему не поиск в ширину?

Очередь может быстро увеличиваться в размерах

Трудоёмкость решения

O(V!)

Классический пример задачи без быстрого решения

По-научному: NP-полная задача

Можно ли решить быстрее?

Да, но только неточно – эвристические алгоритмы

64

Intentionally left blank…65

Применение поиска в глубину

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

Перебор вариантов

Перебор в логических играх (с ограничением глубины)

66

67 Алгоритмы выборанаилучшего хода (решения)

Можно разделить на:

эмпирические алгоритмы – используют приблизительныеправила, основанные на опыте

аналитические алгоритмы – используют результатытеоретического анализа

переборные алгоритмы – используют перебор вариантов

68 Пример эмпирического алгоритма дляигры крестики-нолики 3х3 Возможно ли выиграть одним ходом?

если ДА, выполнить этот ход

Может ли соперник выиграть одним ходом?

если ДА, выполнить ход в клетку угрозы

Свободна ли центральная клетка?

если ДА, занять ее

Свободна ли хотя бы одна угловая клетка?

если ДА, занять одну из угловых клеток

Выполнить ход в любую свободную клетку

NB: можно ли обыграть этот алгоритм?

Пример аналитического алгоритма дляигры в Ним

Есть три кучки камней, два игрока

Игроки ходят по очереди

Каждый ход – взятие любого числа камней (в том числе всех) изодной кучки

Выигрывает тот, кто забирает последние камни

69

Пример аналитического алгоритма дляигры в Ним

Есть три кучки камней, два игрока

Игроки ходят по очереди

Каждый ход – взятие любого числа камней (в том числе всех) изодной кучки

Выигрывает тот, кто забирает последние камни

Алгоритм

Представим число камней в кучках в двоичной системе счисления

Позиция проигрышна, если побитовый XOR этих трёх чисел равен 0

Пример: (12, 10, 7) → (1100, 1010, 0111) → 0001

Выигрышна, делаем ход в (12, 10, 6)

70

Ним: пример

12, 10, 7 → 1100, 1010, 0111 → 0001

12, 10, 6 → 1100, 1010, 0110 → 0000

9, 10, 6 → 1001, 1010, 0110 → 0101

9, 10, 3 → 1001, 1010, 0011 → 0000

9, 7, 3 → 1001, 0111, 0011 → 1101

4, 7, 3 → 0100, 0111, 0011 → 0000

4, 5, 3 → 0100, 0101, 0011 → 0010

4, 5, 1 → 0100, 0101, 0001 → 0000

4, 3, 1 → 0100, 0011, 0001 → 0110

2, 3, 1 → 0010, 0011, 0001 → 0000

71

72 Переборные алгоритмы

Предполагают полный или частичный переборвариантов ходов

73 Переборные алгоритмы – идеальныйвариант

0

-1 1 1 1 -1 -1 -1 0 1 1

Красный выбирает минимум, а синий – максимум

74 Переборные алгоритмы - идеальныйвариант

1

1 -1 0

1 1 1 0 -1 0 1

-1 1 1 1 -1 -1 -1 0 1 1

Позиция выигрышна, нужно сделать левый из трех ходов

75 Переборные алгоритмы – реальныйвариант

1

-9 4 7 8 -5 -12 -7 -2 4 11

76 Переборные алгоритмы - реальныйвариант

4

4 -7 -2

4 7 8 0 -7 -2 inf

-9 4 7 8 -5 -12 -7 -2 4 inf

Нам лучше сделать левый из трех ходов - кажется, результат там более симпатичен

77 Как организовать перебор (минимакс)?

Используется рекурсия

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

Получив позиции уровнем ниже, для каждой из нихмы вызываем ту же функциюТочнее: мы либо имеем две функции, одна из которыхформирует лучшую оценку, а другая худшую

Либо инвертируем оценку при рекурсивном вызове

Выбираем ход, дающий наилучшую оценку

78Как сформировать оценку позиции насамом нижнем уровне?

Используется так называемая оценочная функция

Пример: четыре в ряд79

Пример: четыре в ряд

Оценочная функция – идеи?

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

80

Пример: четыре в ряд

Оценочная функция – идеи?

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

Примеры

Большой бонус обладателю четвёрки

Бонус поменьше обладателю тройки

81

82 Способы улучшениякачества игры

Совершенствование оценочной функции

Использование алгоритмов ускорения перебора

Гибкий выбор глубины перебора

Оптимизация программы с целью увеличения глубиныперебора

Совершенствование оценочной функции

Перебираем все возможные четвёрки

Ищем среди них те, в которых отсутствуют фишки одногоцвета, и смотрим на количество фишек другого

4 = Победа: 10000 (с модификацией на глубину)

3: 500

2: 10

1: 1

83

84 Алгоритмы ускорения перебора

Альфа-бета процедура (он же - метод ветвей и границ)

Алгоритм NEGASCOUT

Алгоритм MTD(f)

85 Альфа-бета процедура

11

13 11

[11, inf]

86 Альфа-бета процедура

11

13 11

[11, inf]

14

9 14

[11, 14]

87 Альфа-бета процедура

11

13 11

[11, inf]

14

9 14

[11, 14]

18

[11, 14]

!!!

88 Альфа-бета процедура

11

13 11

[11, inf]

14

9 14

[11, 14]

13

[13, 14]

[13, 14]

12

!!!

89 Альфа-бета процедура - организация

В функции перебора добавляются два аргумента - [alpha, beta]

На верхнем уровнеalpha=-inf, beta=+inf

При переборе вариантов alpha является нижней границей; еслинашли вариант с лучшей оценкой - alpha увеличивается

При переборе вариантов beta является верхней границей; еслинашли вариант с лучшей оценкой - перебор можно прервать

На следующий уровень передаются текущие значения [alpha, beta] или [-beta, -alpha], в зависимости от того, чей на нем ход

90 Гибкий выбор глубины перебора

Увеличивать глубину перебора, если число перебираемыхвариантов невелико

Итеративный перебор с увеличением глубины

Проверять глубже некоторые варианты

Другие задачи на графе

Топологическая сортировка

Упорядочение вершин ориентированного графа

Построение минимального остовного дерева

Выделение минимального связного подграфа

Поиск циклов в графе

91

Топологическая сортировка

Определена на ориентированном графе без циклов(направленных)

Выход: упорядоченный список вершин, такой, что дляребра A → B вершина A в списке всегда раньше B

92

Топологическая сортировка

Определена на ориентированном графе без циклов(направленных)

Выход: упорядоченный список вершин, такой, что дляребра A → B вершина A в списке всегда раньше B

Применяется, например, для упорядочения выполнениядействий, некоторые из которых зависят от других(сборка в Gradle или через Makefile, пакеты программ вроде rpm и так далее)

93

Топологическая сортировка

Определена на ориентированном графе без циклов(направленных)

Выход: упорядоченный список вершин, такой, что дляребра A → B вершина A в списке всегда раньше B

Алгоритм Тарьяна:

Вводим (для удобства) вершину “0”, соединённую ребром со всемивершинами графа

Обходим граф с помощью поиска в глубину, начиная с “0”

При выходе из вершины ставим её в начало итогового списка

Второй раз в вершину не заходим

94

Топологическая сортировка: пример95

0

A F

B GC

D H

E

Топологическая сортировка: пример96

0

A F

B GC

D H

E

Посещение

0, A, B, E, B, A

Покидаем: E, B

Список: B, E

Топологическая сортировка: пример97

0

A F

B GC

D H

E

Посещение

0, A, B, E, B, A

Покидаем: E, B

Список: B, E

Далее

C, D, C, H, C

Покидаем: D, H, C

Список: C, H, D, B, E

Топологическая сортировка: пример98

0

A F

B GC

D H

E

Далее

C, D, C, H, C

Покидаем: D, H, C

Список: C, H, D, B, E

Далее

A, 0, F, G, F, 0

Покидаем: A, G, F

Список: F, G, A, C, H, D, B, E

Поиск циклов в графе

Применение

Анализ программ

Анализ типов

99

Поиск циклов в графе

Применение

Анализ программ

Анализ типов

Алгоритм Тарьяна

Точно так же используем поиск в глубину

Если второй раз входим в уже посещенную вершину – найденцикл!

100

Поиск циклов: пример101

A F

B GC

D H

E

Поиск циклов: пример102

A F

B GC

D H

E

Посещение

A, B, E, (B), (A), C, D, E

Найден цикл!

Состав

A, B, E

A, C, D, E

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

Задача: оставить во взвешенном графе только часть рёбертак, чтобы все вершины по-прежнему были связаны исуммарный вес этих рёбер был минимальный

103

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

Задача: оставить во взвешенном графе только часть рёбертак, чтобы все вершины по-прежнему были связаны исуммарный вес этих рёбер был минимальный

Вариант: число этих рёбер было минимально

104

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

Задача: оставить во взвешенном графе только часть рёбертак, чтобы все вершины по-прежнему были связаны исуммарный вес этих рёбер был минимальный

Вариант: число этих рёбер было минимально

Очевидное дополнение: циклов в минимальном остовном деревенет

105

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

Задача: оставить во взвешенном графе только часть рёбертак, чтобы все вершины по-прежнему были связаны исуммарный вес этих рёбер был минимальный

Применение: например, оптимизация компьютерной / дорожной сети

106

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

Задача: оставить во взвешенном графе только часть рёбертак, чтобы все вершины по-прежнему были связаны исуммарный вес этих рёбер был минимальный

Алгоритм Краскала

Взять пустое дерево

Пока возможно, добавлять в него ребро графа с минимальнымвозможным весом (из тех, которые не приводят к появлениюцикла)

107

Минимальное остовное дерево: пример108

A F

B GC

D H

E

Минимальное остовное дерево: пример109

A F

B GC

D H

E

A F

B GC

D H

E

Минимальное остовное дерево: пример110

A F

B GC

D H

E

A F

B GC

D H

E

Минимальное остовное дерево: пример111

A F

B GC

D H

E

A F

B GC

D H

E

Минимальное остовное дерево: пример112

A F

B GC

D H

E

A F

B GC

D H

E

Минимальное остовное дерево: пример113

A F

B GC

D H

E

A F

B GC

D H

E

Минимальное остовное дерево: пример114

A F

B GC

D H

E

A F

B GC

D H

E

Поиск компонент связности

Делаем BFS или DFS из произвольной вершины, обойдённые вершины запоминаем

Если ещё остались вершины – повторяем процедуру, начиная с любой из оставшихся вершин

И так далее…

115

Intentionally left blank…

116

Задачи по теории графов (1)

Дано бинарное дерево (произвольное)

По двум узлам найти ближайшего общего предка

117

Задачи по теории графов (1)

Дано бинарное дерево (произвольное)

По двум узлам найти ближайшего общего предка

Идеи для решения:

В бинарном дереве поиска можно идти вверх, анализируя > vs <

В обычном бинарном дереве проще идти вниз, причём один узелвсегда должен быть справа, другой слева

118

Задачи по теории графов (2)

Даны два бинарных дерева

Определить, является ли 2-е дерево поддеревом 1-го

119

Задачи по теории графов (2)

Даны два бинарных дерева

Определить, является ли 2-е дерево поддеревом 1-го

Идеи для решения

~ straight-forward: ищем в первом дереве корень второго, затем под ним ищем остальное поддерево

120

Задачи по теории графов (3)

Дан связный граф

Найти все «важные» рёбра или «мосты», исчезновениелюбого из которых приведёт к тому, что граф станетнесвязным

121

Задачи по теории графов (3)

Дан связный граф

Найти все «важные» рёбра или «мосты», исчезновениелюбого из которых приведёт к тому, что граф станетнесвязным

Идеи для решения

Ни один из мостов не может входить в цикл! И наоборот!

Разметить на графе все циклы, остальное объявить мостами

122

Поиск мостов: пример123

A F

B GC

D H

E

Поиск мостов: нет мостов124

A F

B GC

D H

E

Поиск мостов: пример 2125

A F

B GC

D H

E

Поиск мостов: пример 2126

A F

B GC

D H

E

Задачи по теории графов (4)

Эйлеров цикл – цикл, проходящий через все рёбрасвязного графа ровно по одному разу

127

Задачи по теории графов (4)

Эйлеров цикл – цикл, проходящий через все рёбрасвязного графа ровно по одному разу

Существует, если каждой вершине графа инцидентночётное число рёбер

Задача: найти Эйлеров цикл по графу

128

Задача по теории графов (4)129

Задачи по теории графов (4)

Эйлеров цикл – цикл, проходящий через все рёбрасвязного графа ровно по одному разу

Существует, если каждой вершине графа инцидентночётное число рёбер

Задача: найти Эйлеров цикл по графу

Идеи для решения:

Найти цикл, запомнить и выкинуть из графа рёбра этого цикла.

Повторять, пока рёбра не кончится. Соединить все циклы в один.

130

Задачи по теории графов (4)

Эйлеров цикл – цикл, проходящий через все рёбрасвязного графа ровно по одному разу

Идеи для решения:

Найти цикл, запомнить и выкинуть из графа рёбра этого цикла.

Повторять, пока рёбра не кончится. Соединить все циклы в один.

131

A

B

CD

E

Задачи по теории графов (5)

Дана матрица из букв

Найти в ней все имеющиеся слова (разрешаетсяпереходить от буквы к соседней по горизонтали / вертикали с любым числом поворотов)

И Т Ы Н

К Р А Н

А К В А

132

Задачи по теории графов (5)

Дана матрица из букв

Найти в ней все имеющиеся слова (разрешаетсяпереходить от буквы к соседней по горизонтали / вертикали с любым числом поворотов)

Идеи для решения

Поиск в глубину с проверкой текущего слова по словарю

Возможно использование префиксного дерева для поиска пословарю

133

Итоги

Рассмотрено

Графы

Алгоритмы на основе поиска в ширину

Дейкстра, Волновой, A Star, Беллман-Форд

Алгоритмы на основе поиска в глубину

Перебор вариантов, минимакс, альфа-бета

Другие

Далее

Динамическое программирование

134

top related