Статья Автор: Лебедев Дмитрий

TUZ_3-13 Сортировка циклов в графе

TUZ_3-13 Сортировка циклов в графе

TUZ_3-13 Сортировка циклов в графе
3.13 Сортировка циклов в графе
Цикл в графе – это путь, который начинается и заканчивается в одной и той же вершине.
Рассмотрим массив G, заполненный положительными целыми числами. Каждое число в G является вершиной графа.
Цель этой задачи состоит в том, чтобы найти циклы в G и отсортировать их в некотором порядке.
Например, пусть G = [2, 4, 6, 5, 3, 1, 0] и нужно найти циклы такие, в которых большее число образует первую вершину;
вершины, позиции или индексы которых находятся после позиции с наибольшим числом, вставляются после позиции с наибольшим числом;
а уже за этими вершинами вставляются вершины, позиции или индексы которых находятся перед позицией с наибольшим числом.
Далее необходимо отсортировать все циклы в порядке возрастания.
Рассмотрим порядок решения задачи для нашего примера.
  • Первая вершина в G содержит число 2, какое число находится в индексе 2?
    Поскольку индексация в Python начинается с нуля, мы получаем число 6.
    • Следующий шаг: какое число находится в индексе 6? Это число 0.
    • Следующий шаг: какое число находится в индексе 0? Это число 2,
      следовательно, мы нашли цикл 2 → 6 → 0 → 2.  Вставляем в список первый цикл, C = [[2, 6, 0]].
  • Первая вершина, которую мы не посещали, – это число 4. Она считается первой вершиной следующего цикла.
    • Следующий шаг: какое число стоит в индексе 4? Это число 3.
    • Следующий шаг: какое число находится в индексе 3? Это число 5.
    • Следующий шаг: какое число находится в индексе 5? Это число 1.
    • Следующий шаг: какое число находится в индексе 1? Это число 4.
      Найден еще один цикл, 4 → 3 → 5 → 1 → 4. Добавляем его в список циклов C = [[2, 6, 0], [4, 3, 5, 1]].
  • Теперь в G не осталось вершин, которые мы не посетили, поэтому выполняем процесс сортировки.
    • Для [2, 6, 0] наибольшее число (вершина) равно 6, поэтому [2, 6, 0] → [6], 0 помещаем после 6, поэтому [6] → [6, 0], а 2 предшествовало 6, поэтому [6, 0] → [6, 0,2]. Получаем обновленные циклы: C = [[6, 0, 2], [4, 3, 5, 1]].
    • Во втором цикле [4, 3, 5, 1] наибольшее число равно 5, поэтому [4, 3, 5, 1] → [5].
      За числом 5 в цикле следует 1, поэтому 1 вставляется после 5, а перед 5 мы имеем 4 и 3,
      поэтому добавляем 4 и 3 после 5 и 1.
    • В результате получаем циклы C = [[6, 0, 2], [5, 1, 4, 3]].
  • На следующем шаге циклы сортируются по возрастанию, и получается C = [[6, 0, 2], [5, 1, 4, 3]] → C = [[5, 1, 4, 3], [6, 0, 2]].
  • На последнем этапе вложенные массивы форматируются и преобразуются в единый плоский массив: С = [5, 1, 4, 3, 6, 0, 2].
Ваша задача: написать функцию, которая принимает массив G и возвращает отсортированные циклы.
В табл. 3.13 показаны ожидаемые результаты для некоторых входных данных.
Таблица 3.13. Некоторые ожидаемые результаты для задачи поиска и сортировки циклов в граф
G Ожидаемый результат 
[1, 2, 4, 5, 3, 0] [5, 0, 1, 2, 4, 3]
[1, 2, 3, 4, 0] [4, 0, 1, 2, 3]
[4, 3, 7, 0, 1, 5, 2, 6] [4, 1, 3, 0, 5, 7, 6, 2]
[1, 3, 5, 0, 2, 4] [3, 0, 1, 5, 4, 2]

Алгоритм
Общий алгоритм основан на использовании двух алгоритмов: поиска в глубину (Depth-First Search, DFS) и сортировки.
  • DFS используется для поиска всех циклов в ориентированном графе.
    Этот алгоритм посещает каждую вершину в графе только один раз и исследует исходящие ребра из вершин,
    пока не достигнет конца графа или не найдет цикл.
    Как только цикл будет найден, он добавляется в список циклов,
    и алгоритм переходит к первой непосещавшейся вершине.
  • Алгоритм сортировки сортирует каждый цикл в списке циклов в соответствии с определенными критериями.
В нашем случае первым помещается наибольший элемент цикла, а затем остальные элементы в порядке возрастания. После сортировки циклов они объединяются в общий список. Наконец, отсортированный плоский список возвращается в виде результата.
 


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать