338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
1 | |
Алгоритм поиска элементарных циклов в неориентированном графе23.06.2017, 02:57. Показов 5552. Ответов 28
Метки нет Все метки)
(
Необходимо граф разбить на элементарные циклы, то есть такие циклы, которые не имею внутри подциклов. Пример - на рисунке. Как найти все циклы в графе, я знаю. Но мне нужны не все.
0
|
|
23.06.2017, 02:57 | |
Ответы с готовыми решениями:
28
Поиск всех циклов в неориентированном графе. Нахождение элементарных циклов в графе Метод поиска в глубину, в неориентированном графе Исследовать алгоритм нахождения Эйлерова пути в неориентированном графе |
Модератор
2968 / 2107 / 450
Регистрация: 26.03.2015
Сообщений: 8,229
|
|
23.06.2017, 09:42 | 3 |
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
23.06.2017, 13:07 [ТС] | 5 |
Да, если исходить из того, как я сформулировал, является. Но такого не будет, ибо "в реале" сам граф "формируют" геодезисты.
0
|
Модератор
2968 / 2107 / 450
Регистрация: 26.03.2015
Сообщений: 8,229
|
|
23.06.2017, 13:34 | 6 |
Не является, так как существует ребро (5,11), которое не в ходит в цикл и связывает две вершины из этого цикла.
Добавлено через 7 минут Massaraksh7, Липский. Комбинаторика для программистов. 2.5. Отыскание фундаментального множества циклов в графе. (стр.92) Алгоритм 2.9. (стр.95) Добавлено через 8 минут Элементраный цикл - это цикл, который не имеет самопересечений. А то, что на картинке, называется "цикл без хорд".
1
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
23.06.2017, 13:38 [ТС] | 7 |
Спасибо, посмотрю.
Добавлено через 2 минуты Цикл без хорд состоит из треугольников.
0
|
Модератор
2968 / 2107 / 450
Регистрация: 26.03.2015
Сообщений: 8,229
|
|
23.06.2017, 13:40 | 8 |
Из вики:
Цикл без хорд в графе, также называемый дырой или порождённым циклом, — это цикл, в котором никакие две вершины цикла не соединены ребром, разве что это ребро само принадлежит циклу.
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
23.06.2017, 14:23 [ТС] | 9 |
Хорошо, пусть так. Тогда один из вариантов - найти все циклы, а потом из них исключить те, у которых есть подциклы. По какому принципу? Организовать обход цикла по часовой стрелке, и следить, чтобы справа не было вхождений? Ну или наоборот.
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
||||||
25.06.2017, 16:26 [ТС] | 10 | |||||
Итак, продолжаем. Первым делом надо получить все существующие циклы графа, используя поиск в глубину. Для вот такого простого графа их число получается 416.
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
||||||
25.06.2017, 16:30 [ТС] | 11 | |||||
Это нас не устраивает, среди циклов много повторяющихся. Поэтому при записи нового цикла мы устроим проверку: а не было ли такого цикла раньше?
Получается уже лучше, всего 13 циклов осталось.
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
||||||
25.06.2017, 16:38 [ТС] | 12 | |||||
Но ещё остались циклы внутренними хордами, которые нам не нужны. Поэтому мы устраиваем проверку на них. Делаем это так: определяем направление цикла - по часовой, или против? Для этого находим сумму произведений x[i]*y[i+1]-x[i+1]*y[i] для каждого узла, и, в зависимости от знака, оставляем цикл как есть, или меняем его порядок. После этого проходимся по циклу, и для каждого узла определяем, а нет ответвляется ли вправо ребро, не являющееся частью его оболочки? После этого получаем то, что нам было нужно.
Полный алгоритм на Delphi:
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
25.06.2017, 17:19 [ТС] | 13 |
---
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
||||||
25.06.2017, 19:03 [ТС] | 14 | |||||
Поправка: более надёжное определение внутренних хорд через дирекционные углы.
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
25.06.2017, 19:06 [ТС] | 15 |
---
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
26.06.2017, 16:10 [ТС] | 16 |
И ещё. Это для координат экрана. Для математических координат 58 строка заменяется на
if d>0 then , а 81 на if a3<a1 then begin Result:=true;exit;end;
0
|
338 / 283 / 95
Регистрация: 27.05.2017
Сообщений: 1,486
|
|
29.06.2017, 02:08 [ТС] | 17 |
Обход в глубину из всех точек является лишним. Достаточно из одной (любой).
0
|
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
|
|
05.02.2019, 22:34 | 18 |
а теперь бинго. Отделить элементарный от неэлементарных можно ээээ элементарно.
Фильтрация на базе вот такого признака: В элементарном цикле каждая вершина инцидентна только с двумя другими вершинами входящими в цикл, тогда как в НЕэлементарном обязательно есть как минимум две(но ищем ессно сам факт - т.е. что есть такая вершина) вершины инцидентных с не менее чем тремя другими вершинами.
0
|
Модератор
2968 / 2107 / 450
Регистрация: 26.03.2015
Сообщений: 8,229
|
|
06.02.2019, 09:35 | 19 |
0
|
1 / 1 / 2
Регистрация: 12.07.2013
Сообщений: 144
|
|
06.02.2019, 15:02 | 20 |
Да, и я предложил способ определения таких циклов. Более простой чем:
0
|
06.02.2019, 15:02 | |
Помогаю со студенческими работами здесь
20
Алгоритм поиска слова в графе Алгоритм поиска сечений в графе. Алгоритм поиска слова в заданном Графе Алгоритм поиска в глубину в ориентированном графе Алгоритм поиска всех деревьев в графе Алгоритм поиска циклов неориентированного графа Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |