почему выводится лишнее

Мне нужно написать алгоритм 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);
    
}


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