Нерекурсивный поиск в глубину(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;
}
}
}
}