Нахождение кратчайшего цикла в неориентированном графе, который включает 2 указанные вершины - PullRequest
0 голосов
/ 15 мая 2019

Мне дан набор данных философов, который напоминает неориентированный граф. Философы хранятся в хэш-карте, где ключом является имя философа, а значением - список его соседей.

Пользователь дает 2 имени философа в качестве входных данных, и мне нужно найти кратчайший цикл (если таковой существует), который включает в себя этих 2 философов.

Сначала я подумал, что эта проблема очень похожа на проблему коммивояжера, однако в этой задаче у нас также есть расстояния перемещения, и каждую вершину можно посетить только один раз, что, по-видимому, здесь не так. Решение этой проблемы, кажется, связано с графиком, но я не совсем уверен, какой алгоритм использовать или даже какая проблема похожа на него.

Решение, которое я задумал, заключалось в нахождении всех циклов в данном графике, сводя результаты только к циклам, которые содержат философы, заданные пользователем, и выбирая только самые короткие циклы из этих, так как я оценил бы циклы на основе того, как они совершают много «прыжков», которые, по сути, будут простым счетчиком. Проблема в том, что я боюсь, что это не может быть оптимальным решением, учитывая, насколько большой набор данных и сколько циклов потенциально может быть сформировано (много).

Вывод должен быть в следующем формате: {u1, u2, u3, u4, u5, u1}, где u - имя каждого философа, который создает цикл, который я ищу. Если такого цикла не существует, мне просто нужно напечатать соответствующее сообщение.

1 Ответ

1 голос
/ 15 мая 2019

Вы можете использовать вариант алгоритма Suurballe. Как объясняет Википедия (на https://en.wikipedia.org/wiki/Suurballe's_algorithm):

Алгоритм Суурбалла - это алгоритм нахождения двух непересекающихся путей в неотрицательно-взвешенном ориентированном графе, так что оба пути соединяют одну и ту же пару вершин и имеют минимальную общую длину. [& hellip;] Основная идея алгоритма Суурбалла состоит в том, чтобы использовать алгоритм Дейкстры для нахождения одного пути, изменить вес ребер графа, а затем запустить алгоритм Дейкстры во второй раз. Выходные данные алгоритма формируются путем объединения этих двух путей, отбрасывания ребер, которые проходят пути в противоположных направлениях, и использования оставшихся ребер для формирования двух путей, которые возвращаются в качестве выходных данных.

и позже:

Версия алгоритма Суурбалла, как описано выше, находит пути, которые имеют непересекающиеся ребра, но могут иметь общие вершины. Можно использовать тот же алгоритм, чтобы найти пути, не пересекающиеся с вершинами, заменив каждую вершину парой смежных вершин, одна со всеми входящими смежностями u-in исходной вершины и одна с все исходящие смежности u-out . Два непересекающихся по ребру пути в этом измененном графе обязательно соответствуют двум непересекающимся по вершинам путям в исходном графе, и наоборот, поэтому применение алгоритма Суурбалла к модифицированному графу приводит к построению двух непересекающихся по вершинам путей в исходном графе.

Так что вам нужно будет перевести ваш невзвешенный, неориентированный график | V | вершины и | E | невзвешенные ненаправленные ребра к взвешенному ориентированному графу 2 | V | вершины и 2 | E | + | V | взвешенные, направленные ребра; затем примените алгоритм Суурбалла; затем переведите результат обратно в цикл на исходном графике.

...