#depth-first-search #backtracking
#поиск по глубине в первую очередь #обратный поиск
Вопрос:
boolean backtrackDFS(v) {
If (SolutionFound(v)) return true;
Mark vertex v as reached.
for (each unreached vertex u adjacenct from v)
if (backtrakDFS(u)) return true;
Unmark vertex v;
return false;
}
Вот зачем Unmark vertex v
это нужно?
и почему безопасно добавлять такую строку, поскольку, следовательно, v снова становится недостижимым, приведет ли это к повторному просмотру?
Ответ №1:
Я не думаю, что это необходимо. Обычно хорошей практикой является отмена того, что вы делаете, и оставление вещей такими, какими они были, когда вы их нашли.
Например, включение этой строки позволило бы вам выполнять поиск с использованием одной и той же функции более одного раза без отдельной операции по очистке меток.
Комментарии:
1. и почему безопасно добавлять такую строку, поскольку, следовательно, v снова становится недостижимым, приведет ли это к повторному просмотру?
2. @colinfang: Нет, эта строка не будет вызвана до тех пор, пока не будут исследованы все связанные ветви, поэтому она не будет очищена до тех пор, пока не исчезнет вероятность ее повторного просмотра.