2012-06-11 3 views
0

Я работаю над тем, чтобы получить все возможные пути, начиная с узла «А» и заканчивая на том же узле. График - ориентированный граф (каждый узел соединен, по меньшей мере, с одним узлом).Алгоритмы теории диаграмм

Ограничения: я могу посетить узел ровно один раз, за ​​исключением, (конечно, стартового узла).

Проблема: Я попытался реализовать это, используя функцию графаграфа в MATLAB, но это дает мне только один такой способ. Любой алгоритм или логика, которые могут быть реализованы в C, java, будут работать.

Я был бы рад, если кто-то может дать мне какие-либо указания на него.

Примечание: я не хочу кратчайший путь, я хочу набор возможных путей.

+0

Если граф является циклическим, может быть бесконечное число путей. – Jochen

+0

Nany: Обратите внимание, что вы также можете оставлять комментарии непосредственно под вопросом. @Jochen не может быть уведомлен о том, кого вы положили под ответ, данный кем-то другим. –

+0

@Jochen «Я могу посетить узел ровно один раз»; тогда не может быть бесконечных путей. – AnotherUser

ответ

0

Не знаю свой уровень, но boost библиотека очень хорошо, если вы можете получить его правильно настроены

+0

@Jochen: Я думаю, что конечно нет. путей, потому что я не могу посещать какой-либо промежуточный узел более одного раза. Также, поскольку очень мало узлов, которые возвращаются к исходному узлу, если мы сможем найти все пути между начальными узлами и этими узлами, это будет решено. –

1

Почему бы не написать свою собственную рекурсивную функцию?

findPath(Node start, Node end, List<Node> alreadyVisited) 
    for (Node neighbor: other ends of outgoing edges from start) { 
     if (neighbor == end) 
      display("Found a path: " + alreadyVisited + end) 
     else if (neighbor not in alreadyVisited) 
      findPath(neighbor, end, alreadyVisited + neighbor) 
    } 

... или что-то подобное. Поскольку вы ищете циклы, начальный вызов должен иметь то же значение, которое передается start и end. Конечно, если вывод в приглашение недостаточен, вам нужно собрать правильные пути в глобальном массиве или найти более элегантный способ их возврата.

Кроме того, выполнение двунаправленного поиска (одновременное слежение за входящими краями и проверка пересечения узлов, достигнутых последовательными исходящими краями и последовательными входящими ребрами, а не только достижение желаемой конечной точки) должны быть более быстрыми для больших графиков.

+0

Как выглядит класс «Graph»? – Brackets

+1

@Brackets Я не помню, почему я добавил параметр «graph» - это не кажется необходимым, поэтому я удалил его. Если каждый 'Node' содержит список своих соседей, не требуется отдельный класс графа. –

Смежные вопросы