почему выводится лишнее
Мне нужно написать алгоритм DFS от вершины 1. Когда я дохожу до вершины из которой мне нужно выкатиться, т.к. я не могу больше никуда из нее пойти, то мне нужно вывести ее в выходной файл. Мне дан ориентированный граф с ребрами: (1, 2), (2,3), (3, 4). Я сначала считываю с входного файла число вершин графа, затем число ребер, затем сами эти ребра. Дальше я заполняю список смежности для этого графа и выполняю алгоритм DFS рекурсивно. Мне нужно в ответе в итоге получить 4 3 2 1. Однако мне выводит 4 3 2 1 3 2 1. Я не понимаю почему. Когда он выводит 1, то он должен выйти из функции DFS-VISIT и больше ничего он не должен делать, однако он почему-то выводит после 1 - 3 2 1.
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream in("topsort.in");
ofstream out("topsort.out");
typedef vector< vector<int> > graph;
void DFS_VISIT(graph &G, int vertex, vector<char> &color, vector<int> &memory);
int main() {
int n;
in >> n; //число вершин
int m;
in >> m; //число ребер
graph list(n); //список смежности
vector<int> memory(n, -1); //массив, который запоминает прошлые вершины, чтобы можно было бы в них выкатиться
vector<pair<int, int>> ribs(m); //для заполнения списка смежности
for (int i = 0; i < m; i++) {
in >> ribs[i].first;
in >> ribs[i].second;
list[ribs[i].first - 1].push_back(ribs[i].second - 1); //заполняю список смежности
}
vector<char> color(n); //для покраски вершины: w - white, g - gray, b - black
for (int vertex = 0; vertex < n; vertex++) {
color[vertex] = 'w'; //все вершины изначально белого цвета
}
int vertex = 0;//DFS от первой вершины(мне нужен DFS от вершины 1; здесь 0 стоит из-за моей реализации списка смежности и покраски вершин; то есть мой алгоритм воспринимает все вершины графа на один меньше, чем они есть, но я просто потом вывожу саму вершину и прибавляю 1, и выводятся нужные вершины
if (color[vertex] == 'w') {
DFS_VISIT(list, vertex, color, memory);
}
return 0;
}
void DFS_VISIT(graph& G, int vertex, vector<char>& color, vector<int> &memory) {
if (color[vertex] == 'b') {
return;
}
if (color[vertex] == 'w') {
color[vertex] = 'g';
}
for (int adjacent_vertex = 0; adjacent_vertex < G[vertex].size(); adjacent_vertex++) {
if (color[G[vertex][adjacent_vertex]] == 'w') {
memory[vertex] = vertex;
DFS_VISIT(G, G[vertex][adjacent_vertex], color, memory);
}
}
color[vertex] = 'b';
out << vertex + 1 << " ";
if (vertex - 1 == -1) {
return;
}
DFS_VISIT(G, memory[vertex - 1], color, memory);
}