Как правильно организовать данный алгоритм?
start - указываем с какой вершины начинать. В массиве visited ставим, что мы эту вершину прошли (true). Добавляем эту вершину в стек. Дальше цикл, пока стек не пустой, ищем вершины которые есть связанные с той, что в стеке, и не были еще посещены (false). Если такие находятся - отмечаем что, мы ее посетили и присваиваем шаг, на котором она была посещена (dfs) и помещаем ее в вершину стека. Потом должна выполняться проверка: если вершина, у которой все смежные были посещены, еще есть в стеке - удаляем ее.
void detour::DFS(int start)
{
int dfs = 0;
Stack stack;
visited[start] = true;
dfsnumber[start] = ++dfs;
stack.Push(start);
while(stack.first)
{
for(int i=0; i<size; i++)
{
if((graph[stack.first->data][i]) && !(visited[i]))
{
visited[i] = true;
dfsnumber[i] = ++dfs;
stack.Push(i);
}
}
stack.Pop();
}
}
Граф задается матрицей смежности. dfs - шаг, на котором вершина посещена.
У вас глобальная ошибка в логике.
while(stack.first){
for(int i=0; i<size; i++){
/*...*/
stack.Push(i);
}
stack.Pop();
}
Вы кладёте в стек сразу все смежные с данной вершиной. Так делать нельзя. Если вам сильно нужно написать нерекурсивный вариант рекурсивного алгоритма, то нужно хранить переменные i (для каждого значения стека) в массиве.
Пример теста:
1->2
2->3
2->4
3->4
Ожидание - 1->2->3->4 ваш вывод (если докодить) 1->2->4->3.
если вершина, у которой все смежные были посещены, еще есть в стеке - удаляем ее
Тут странная формулировка, наверное имелось ввиду в вершине стека. Если это исправить то код скорее всего будет рабочий.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники