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] |