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

Необходимо реализовать нерекурсивный поиск в глубину. Не могу понять в чем заключается ошибка.

Пример:

Входные данные:

8 10 //Кол-во вершин и ребер соответственно. Далее идет список смежных вершин

0 1

1 3

1 2

1 5

2 6

5 2

6 5

2 4

4 7

7 5

Выходные данные: 0 1 2 4 7 6 3 5

Ожидаемый ответ: 0 1 2 4 7 5 6 3

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

int n, m;
vector <vector<int>> g;
vector <bool> mark;
   
void dfs(int v){
    stack <int> s;
    s.push(v);
    mark[v] = true;
    
    while (!s.empty()){
        int u = s.top();
        cout << u << ' ';
        s.pop();
        
        for(int i = g[u].size(); i > -1; i--){
            if (!mark[g[u][i]]){
                s.push(g[u][i]);
                mark[g[u][i]] = true;
            }
        }
    }
    
}

int main () {
    int i, j, a, b;
    cin >> n >> m;
    
    g.resize(n);
    mark.resize(n, false);
    for(i = 0; i < m; i++){
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    
    for(i = 0; i < n; i++)
        sort(g[i].begin(), g[i].end());
    
    dfs(0);
    return 0;
}

Ответы (1 шт):

Автор решения: Pavel Chernitsyn

Дело в том, что вы помечаете вершины как посещённые в момент добавления их на стек. Нужно же делать это в момент, когда вы "стоите" в вершине. Например, вот так:

void dfs(int v){
    stack <int> s;
    s.push(v);
    // mark[v] = true;
    
    while (!s.empty()){
        int u = s.top();
        if (mark[u])
        {
            s.pop();
            continue;
        }
        mark[u] = true;
        cout << u << ' ';
        s.pop();
        
        for(int i = g[u].size(); i > -1; i--){
            if (!mark[g[u][i]]){
                s.push(g[u][i]);
                // mark[g[u][i]] = true;
            }
        }
    }
}
→ Ссылка