Слайд 2Определение
Предок (в наиболее используемом понимании), родитель – это вершина, из которой был
![Определение Предок (в наиболее используемом понимании), родитель – это вершина, из которой](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-1.jpg)
совершён переход в данную.
Предок вершины в дереве – любая вершина, расположенная на пути от данной до корня.
Наименьший общий предок двух вершин – это вершина максимально удалённая от корня дерева, которая является предком для обоих этих вершин.
Слайд 3Алгоритм поиска циклов
Проведём поиск в глубину. Если граф ненаправленный, то дополнительно для
![Алгоритм поиска циклов Проведём поиск в глубину. Если граф ненаправленный, то дополнительно](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-2.jpg)
каждой вершины будем хранить родителя (номер вершины, из которой мы пришли в текущую), переход в родителя осуществлять не будем.
Если в какой-то момент обхода мы зашли в серую вершину, то мы нашли цикл.
С момента нахождения цикла будем добавлять текущую вершину в перечень вершин цикла и откатываться к предыдущей, пока не дойдём то старта цикла.
Слайд 4Разница в нахождении цикла в направленном и ненаправленном графах
1
2
Нет цикла
1
2
Нет цикла
1
2
Есть цикл
![Разница в нахождении цикла в направленном и ненаправленном графах 1 2 Нет](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-3.jpg)
Слайд 5Поиск циклов. Пример. Шаг 0
7
2
6
5
8
3
4
1
1
3
2
5
4
6
7
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 0 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-4.jpg)
Слайд 67
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
Поиск циклов. Пример. Шаг 1
![7 2 6 5 8 3 4 1 1 3 2 6](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-5.jpg)
Слайд 7Поиск циклов. Пример. Шаг 2
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 2 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-6.jpg)
Слайд 8Поиск циклов. Пример. Шаг 3
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 3 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-7.jpg)
Слайд 9Поиск циклов. Пример. Шаг 4
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 4 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-8.jpg)
Слайд 10Поиск циклов. Пример. Шаг 5
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 5 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-9.jpg)
Слайд 11Поиск циклов. Пример. Шаг 6
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 6 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-10.jpg)
Слайд 12Поиск циклов. Пример. Шаг 7
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 7 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-11.jpg)
Слайд 13Поиск циклов. Пример. Шаг 8
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 8 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-12.jpg)
Слайд 14Поиск циклов. Пример. Шаг 9
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 9 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-13.jpg)
Слайд 15Поиск циклов. Пример. Шаг 10
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 10 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-14.jpg)
Слайд 16Поиск циклов. Пример. Шаг 11
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 11 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-15.jpg)
Слайд 17Поиск циклов. Пример. Шаг 12
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – нет
Вершины в цикле:
![Поиск циклов. Пример. Шаг 12 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-16.jpg)
Слайд 18Поиск циклов. Пример. Шаг 13
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – да
Вершины в цикле: 4
![Поиск циклов. Пример. Шаг 13 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-17.jpg)
Слайд 19Поиск циклов. Пример. Шаг 14
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – да
Вершины в цикле: 4, 3
![Поиск циклов. Пример. Шаг 14 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-18.jpg)
Слайд 20Поиск циклов. Пример. Шаг 15
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – да
Вершины в цикле: 4, 3,
![Поиск циклов. Пример. Шаг 15 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-19.jpg)
8
Слайд 21Поиск циклов. Пример. Шаг 16
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – да
Вершины в цикле: 4, 3,
![Поиск циклов. Пример. Шаг 16 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-20.jpg)
8
Слайд 22Поиск циклов. Пример. Шаг 17
7
2
6
5
8
3
4
1
1
3
2
6
7
5
4
Цикл найден – да
Вершины в цикле: 4, 3,
![Поиск циклов. Пример. Шаг 17 7 2 6 5 8 3 4](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-21.jpg)
8
Слайд 23Реализация
На рисунке представлен алгоритм нахождения цикла в ненаправленном графе.
В цикле в функции
![Реализация На рисунке представлен алгоритм нахождения цикла в ненаправленном графе. В цикле](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-22.jpg)
main вызов поиска осуществляется как dfs(i, -1), а не dfs(i).
Для направленного графа не нужно обрабатывать случай с предком.
Слайд 24Алгоритм проверки является ли одна вершина предком для другой
Для каждой вершины будем
![Алгоритм проверки является ли одна вершина предком для другой Для каждой вершины](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-23.jpg)
дополнительно хранить время входа в неё (tin) и время выхода (tout).
Для этого заведём глобальный таймер. При входе в вершину запомним значение таймера в tin, и увеличим таймер на 1. Аналогично при выходе из вершины.
Вершина А является предком вершины В тогда и только тогда, когда A.tin ≤ B.tin и B.tout ≤ A.tout.
Стоит отметить, что при такой формулировке каждая вершина является своим же предком. Если такое явление нежелательно, то неравенства следует заменить на строгие.
Слайд 25Предки в дереве
0
1
2
3
5
6
4
8
7
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
![Предки в дереве 0 1 2 3 5 6 4 8 7](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-24.jpg)
Слайд 26Наивный алгоритм нахождения наименьшего общего предка вершин А и В
С помощью обхода
![Наивный алгоритм нахождения наименьшего общего предка вершин А и В С помощью](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1125787/slide-25.jpg)
в глубину, запущенного из корня, для каждой вершины посчитаем её время входа, время выхода и глубину (удалённость от корня).
В качестве результата на старте алгоритма возьмём корень дерева.
Переберём все вершины. Если вершина является предком для обеих вершин А и В, и она расположена глубже, чем текущая вершина, хранящаяся в результате, то данная вершина становится новым результатом.