Ваш код на самом деле не поддерживает DFS. Для того, что вы делаете, разница не актуальна, подумайте, что произойдет, если вы захотите создать дерево DFS (чтобы вы сохранили все используемые ребра). Рассмотрим следующий (ненаправленный) график:
A -- B -- C -- D
|---------| <- connection between B and D
Теперь мы запускаем DFS на узле A. Произойдет следующее:
head | st | used edge | saved edges
A | B | |
B | C, D | A -- B | A -- B
C | D | B -- C | A -- B, B -- C
D | | B -- D | A -- B, B -- C, B -- D
Соответствующая часть, которую вы используете B -- D
, поскольку вы отмечаете D
в первый раз, когда вы сталкиваетесь с этим. Таким образом, ваше дерево DFS будет выглядеть так:
A -- B -- C
|
D
, что неправильно. Это должно выглядеть так:
A -- B -- C -- D // C and D can be exchanged
Это актуально? Для определенных приложений DFS это так. Для простого нахождения узла каким-либо способом это не имеет значения, вы все равно будете проверять весь график таким образом. Действительно, DFS в основном используется как простой алгоритм сбора графов, поэтому для ребер используется, вероятно, неважно почти для всех приложений. (На самом деле я могу сейчас думать только о том, где это важно)