Единственный элемент поиска в глубину, который вы настраиваете, - это порядок, в котором исследуются дети. Обычная версия работает в произвольном порядке, то есть в том порядке, в котором хранятся дочерние элементы.
Единственная возможная альтернатива (к кратчайшим путям), которую я могу придумать, - это жадный подход, который смотрит на детей в порядке их расстояния от текущего узла (от маленького к большому). Легко построить контрпример для этого правила:
[ источник ]
Теперь, это не доказательство того, что не существует стратегии выбора следующего ребенка, который будет исследован, который заставит DFS находить кратчайшие пути.
Однако, независимо от правила… вы можете построить графы, в которых DFS фиксируют длинный обход на самом первом узле, как я это делал для жадного правила. Присвоить ребра и веса , такие , что правило выбирает для посещения первый и назначить на вес больше , чем один из . Следовательно, вполне вероятно, что DFS никогда не сможет найти кратчайшие пути (в общих графах).( s , a ) a ( a , b ) ( s , t )(s,t)(s,a)a(a,b)(s,t)
Обратите внимание, что поскольку вы можете выразить каждый взвешенный граф (с положительным целым числом) как невзвешенный граф - просто замените ребра стоимостью на цепочку с узлами - те же примеры работают с DFS на невзвешенных графах. Здесь ситуация на самом деле еще более безрадостная: без весов, что DFS может использовать для определения следующего ребенка, который посетит?с - 1cc−1
- Пока правило является детерминированным. Если это не так, он явно не всегда может найти кратчайшие пути.