Similar presentations:
Графы. Поиск циклов. Определение предков в дереве
1.
ГРАФЫПОИСК ЦИКЛОВ
ОПРЕДЕЛЕНИЕ ПРЕДКОВ
В ДЕРЕВЕ
Школа::Кода
Олимпиадное
программирование
2020-2021 Таганрог
2.
Определение• Предок (в наиболее используемом понимании), родитель –
это вершина, из которой был совершён переход в данную.
• Предок вершины в дереве – любая вершина,
расположенная на пути от данной до корня.
• Наименьший общий предок двух вершин – это вершина
максимально удалённая от корня дерева, которая является
предком для обоих этих вершин.
3.
Алгоритм поиска циклов1. Проведём поиск в глубину. Если граф ненаправленный, то
дополнительно для каждой вершины будем хранить
родителя (номер вершины, из которой мы пришли в
текущую), переход в родителя осуществлять не будем.
2. Если в какой-то момент обхода мы зашли в серую вершину,
то мы нашли цикл.
3. С момента нахождения цикла будем добавлять текущую
вершину в перечень вершин цикла и откатываться к
предыдущей, пока не дойдём то старта цикла.
4.
Разница в нахождении цикла внаправленном и ненаправленном графах
1
2
Нет цикла
1
2
Нет цикла
1
2
Есть цикл
5.
Поиск циклов. Пример. Шаг 01
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
6.
Поиск циклов. Пример. Шаг 11
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
7.
Поиск циклов. Пример. Шаг 21
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
8.
Поиск циклов. Пример. Шаг 31
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
9.
Поиск циклов. Пример. Шаг 41
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
10.
Поиск циклов. Пример. Шаг 51
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
11.
Поиск циклов. Пример. Шаг 61
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
12.
Поиск циклов. Пример. Шаг 71
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
13.
Поиск циклов. Пример. Шаг 81
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
14.
Поиск циклов. Пример. Шаг 91
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
15.
Поиск циклов. Пример. Шаг 101
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
16.
Поиск циклов. Пример. Шаг 111
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
17.
Поиск циклов. Пример. Шаг 121
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – нет
Вершины в цикле:
7
18.
Поиск циклов. Пример. Шаг 131
1
5
4
2
4
5
3
6
8
2
3
7
6
Цикл найден – да
Вершины в цикле: 4
7
19.
Поиск циклов. Пример. Шаг 141
1
5
4
6
2
4
5
3
8
2
3
7
6
Цикл найден – да
Вершины в цикле: 4, 3
7
20.
Поиск циклов. Пример. Шаг 151
1
5
4
6
2
4
5
3
8
2
3
7
6
Цикл найден – да
Вершины в цикле: 4, 3, 8
7
21.
Поиск циклов. Пример. Шаг 161
1
5
4
6
2
4
5
3
8
2
3
7
6
Цикл найден – да
Вершины в цикле: 4, 3, 8
7
22.
Поиск циклов. Пример. Шаг 171
1
5
4
6
2
4
5
3
8
2
3
7
6
Цикл найден – да
Вершины в цикле: 4, 3, 8
7
23.
Реализация• На рисунке представлен
алгоритм нахождения цикла в
ненаправленном графе.
• В цикле в функции main вызов
поиска осуществляется как
dfs(i, -1), а не dfs(i).
• Для направленного графа не
нужно обрабатывать случай с
предком.
24.
Алгоритм проверки является ли однавершина предком для другой
• Для каждой вершины будем дополнительно хранить время
входа в неё (tin) и время выхода (tout).
• Для этого заведём глобальный таймер. При входе в
вершину запомним значение таймера в tin, и увеличим
таймер на 1. Аналогично при выходе из вершины.
• Вершина А является предком вершины В тогда и только
тогда, когда A.tin ≤ B.tin и B.tout ≤ A.tout.
• Стоит отметить, что при такой формулировке каждая
вершина является своим же предком. Если такое явление
нежелательно, то неравенства следует заменить на
строгие.
25.
Предки в дереве1
2
1
3
6
5
4
7
4
0
2
20
17
14
15
5
8
7
9
10
18
16
6
13
8
12
11
9
19
3
26.
Наивный алгоритм нахождения наименьшегообщего предка вершин А и В
1. С помощью обхода в глубину, запущенного из корня, для
каждой вершины посчитаем её время входа, время
выхода и глубину (удалённость от корня).
2. В качестве результата на старте алгоритма возьмём
корень дерева.
3. Переберём все вершины. Если вершина является предком
для обеих вершин А и В, и она расположена глубже, чем
текущая вершина, хранящаяся в результате, то данная
вершина становится новым результатом.