алгоритм поиска по глубине возврата в псевдокоде

#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: Нет, эта строка не будет вызвана до тех пор, пока не будут исследованы все связанные ветви, поэтому она не будет очищена до тех пор, пока не исчезнет вероятность ее повторного просмотра.