Нерекурсивный поиск в глубину

518
26 ноября 2016, 18:55

Как правильно организовать данный алгоритм?

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 - шаг, на котором вершина посещена.

Answer 1

У вас глобальная ошибка в логике.

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.

если вершина, у которой все смежные были посещены, еще есть в стеке - удаляем ее

Тут странная формулировка, наверное имелось ввиду в вершине стека. Если это исправить то код скорее всего будет рабочий.

READ ALSO
Перестал работать getch()

Перестал работать getch()

Перестал работать getch()Компилирует без ошибок, а работать, как следует не хочет, не реагирует на нажатие клавиш

303
как вставить значения получаемые в С++ (qtcharts) в qml в определенной вкладке

как вставить значения получаемые в С++ (qtcharts) в qml в определенной вкладке

Перечитал весь гугл по мвс получаю с помощью методов класса данные, в формате [x,y;x,y;

290
Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. C++

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]. C++

Сжать массив, удалив из него все элементы, величина которых находится в интервале [a,b]Освободившийся в конце массива элементы заполнить нулями

464
Перевод изображения в матрицу чисел

Перевод изображения в матрицу чисел

С помощью каких библиотек можно представить изображение в виде матрицы чисел RGB

471