Путь - это последовательность вершин, в которой ни одна вершина не повторяется более одного раза. Учитывая это определение, вы могли бы написать рекурсивный алгоритм, который будет работать следующим образом: передать в функцию четыре параметра, назвать ее F(u, v, intermediate_list, no_of_vertices)
, где u
- текущий источник (который изменится при повторном использовании), v
intermediate_list
- это список вершин, который изначально должен быть пустым, и каждый раз, когда мы используем вершину, мы добавляем его в список, чтобы избежать использования вершины более одного раза в нашем пути, а no_of_vertices
- это длина пути, который мы хотели бы найти, который должен быть ограничен снизу 2
, а верхний ограничен V
- числом вершин. По сути, функция должна возвращать список путей, чей источник u
, пункт назначения v
и длина каждого пути no_of_vertices
. Создайте начальный пустой список и сделайте вызовы F(u, v, {}, 2), F(u, v, {}, 3), ..., F(u, v, {}, V)
, каждый раз объединяя выходные данные F
со списком, в котором мы намерены хранить все пути. Попробуйте реализовать это, и если у вас все еще возникнут проблемы, я напишу для вас псевдокод.
Редактировать: Решение вышеуказанной проблемы с использованием BFS: поиск в ширину - это алгоритм, который можно использовать для изучения всех состояний графа. Вы можете изучить график всех путей данного графа, используя BFS, и выбрать пути, которые вы хотите. Для каждой вершины v
добавьте следующие состояния в очередь: (v, {v}, {v})
, где каждое состояние определено как: (current_vertex, list_of_vertices_already_visited, current_path)
. Теперь, пока очередь не пуста, откройте верхний элемент очереди, для каждого ребра e
из current_vertex
, если в list_of_vertices_already_visited
хвостовая вершина x
еще не существует, нажмите Новое состояние (x, list_of_vertices_already_visited + {x}, current_path -> x)
в очереди, и обрабатывать каждый путь, когда вы извлекаете его из очереди. Таким образом, вы можете искать весь график путей для графика, будь то направленный или ненаправленный.