Допустим, у нас есть полносвязный ориентированный граф G
. Вершины [a,b,c]
. Между каждой вершиной есть ребра в обоих направлениях.
Учитывая начальную вершину a
, я хотел бы пройти по графу во всех направлениях и сохранить путь только тогда, когда я попаду в вершину, которая уже находится на пути.
Итак, функция full_paths(a,G)
должна возвращать:
- [{a,b}, {b,c}, {c,d}]
- [{a,b}, {b,d}, {d,c}]
- [{a,c}, {c,b}, {b,d}]
- [{a,c}, {c,d}, {d,b}]
- [{a,d}, {d,c}, {c,b}]
- [{a,d}, {d,b}, {b,c}]
Мне не нужны «неполные» результаты, такие как [{a,b}]
или [{a,b}, {b,c}]
, потому что они уже содержатся в первом результате.
Есть ли другой способ сделать это, кроме создания набора мощности G и фильтрации результатов определенного размера?
Как я могу это рассчитать?
Редактировать: как указал Итан, это можно решить с помощью метода поиска в глубину, но, к сожалению, я не понимаю, как его модифицировать, чтобы он сохранял путь перед возвратом (я использую Ruby Gratr для реализации моего алгоритма)