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

134
Алгоритмы и структуры данных Лекция 7. Графы. (с) Глухих Михаил Игоревич, [email protected]

Upload: others

Post on 01-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

(с) Глухих Михаил Игоревич, [email protected]

Page 2: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

2 Граф

Page 3: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

схемы метро

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

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

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

карты дорог

...

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

Page 4: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 5: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

15

20

15

10

15

15

5

Page 6: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

6

Page 7: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

7

Page 8: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

8

Page 9: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

9

Page 10: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

10

Page 11: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

11

Page 12: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

12

Page 13: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

13

Page 14: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

14

Page 15: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

15

Page 16: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

16

Page 17: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

0 <= E <= V2

17

Page 18: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Интерфейс «Граф» на 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

Page 19: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Обход графа

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

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

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

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

19

Page 20: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Обход графа

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

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

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

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

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

20

Page 21: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Обход графа

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

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

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

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

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

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

21

Page 22: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 23: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 24: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 25: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

25

Page 26: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

15

20

15

10

15

15

5

Page 27: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 28: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 29: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 30: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

(with shortest distance…)

Java: PriorityQueue

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

30

Page 31: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

(with shortest distance…)

Java: PriorityQueue

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

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

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

31

Page 32: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

32

Page 33: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

33

Page 34: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

34

Page 35: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Page 36: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

36

Page 37: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

37

Page 38: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

38

Page 39: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

39

Page 40: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

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

40

Page 41: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

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

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

41

Page 42: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Требования

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

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

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

42

Page 43: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

O(VE)

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

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

43

Page 44: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 45: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 46: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 47: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

47

Page 48: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

48

Page 49: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

49

Page 50: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

50

Page 51: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

51

Page 52: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

52

Page 53: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

0 5

10

15

30

1040

5

1525

20

1 2

43

Page 54: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

54

Page 55: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

55

Page 56: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

0

1

0 2 3

5

10

15

30

1040

5

1525

20

1 2

43

0

Page 57: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

0

1

0 2

1 4

2

10

25

55 30

35 4555

5

53

?? ??

40

70

3

95

0

115

Page 58: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Page 59: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Page 60: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

60

Page 61: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

61

Page 62: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

62

Page 63: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

O(V!)

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

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

63

Page 64: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

O(V!)

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

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

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

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

64

Page 65: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Intentionally left blank…65

Page 66: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

66

Page 67: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

Page 68: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

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

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

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

Page 69: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

69

Page 70: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

Алгоритм

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

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

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

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

70

Page 71: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 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

Page 72: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 73: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

0

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

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

Page 74: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

1

1 -1 0

1 1 1 0 -1 0 1

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

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

Page 75: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

1

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

Page 76: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

4

4 -7 -2

4 7 8 0 -7 -2 inf

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

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

Page 77: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

Page 78: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Page 79: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Page 80: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

80

Page 81: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

Примеры

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

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

81

Page 82: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

Page 83: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

3: 500

2: 10

1: 1

83

Page 84: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

Алгоритм NEGASCOUT

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

Page 85: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

11

13 11

[11, inf]

Page 86: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

11

13 11

[11, inf]

14

9 14

[11, 14]

Page 87: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

11

13 11

[11, inf]

14

9 14

[11, 14]

18

[11, 14]

!!!

Page 88: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

11

13 11

[11, inf]

14

9 14

[11, 14]

13

[13, 14]

[13, 14]

12

!!!

Page 89: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

Page 90: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

Page 91: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

91

Page 92: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

92

Page 93: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

93

Page 94: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

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

94

Page 95: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

0

A F

B GC

D H

E

Page 96: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

0

A F

B GC

D H

E

Посещение

0, A, B, E, B, A

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

Список: B, E

Page 97: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Топологическая сортировка: пример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

Page 98: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Топологическая сортировка: пример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

Page 99: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Применение

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

Анализ типов

99

Page 100: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Применение

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

Анализ типов

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

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

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

100

Page 101: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 102: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Посещение

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

Найден цикл!

Состав

A, B, E

A, C, D, E

Page 103: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

103

Page 104: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

104

Page 105: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

105

Page 106: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

106

Page 107: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

107

Page 108: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 109: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 110: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 111: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 112: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 113: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 114: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

A F

B GC

D H

E

Page 115: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

И так далее…

115

Page 116: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Intentionally left blank…

116

Page 117: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

117

Page 118: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

118

Page 119: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

119

Page 120: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

120

Page 121: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

121

Page 122: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

122

Page 123: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 124: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 125: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 126: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

A F

B GC

D H

E

Page 127: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

127

Page 128: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

128

Page 129: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

Page 130: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

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

130

Page 131: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

131

A

B

CD

E

Page 132: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

И Т Ы Н

К Р А Н

А К В А

132

Page 133: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

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

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

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

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

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

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

133

Page 134: Алгоритмы и структуры данныхkspt.icc.spbstu.ru/media/files/2019/asd/07_Graphs_Full.pdf · 0 2 3 1 4 1 0 2 10 25 20 55 30 35 55 45 45 40 5 3 5?? ?? 0 4 70

Итоги

Рассмотрено

Графы

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

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

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

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

Другие

Далее

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

134