Отображение обхода графа поиска в глубину C++

Я работаю над обходом графа, который я настроил как класс, используя векторы для хранения вершин и ребер. Я использую поиск в глубину на графике, чтобы показать пути по мере их прохождения, но я хотел бы каким-то образом заставить мой код отображать вершины в том порядке, в котором они проходят, в формате вроде этого:

<u, i1, i2, ... v>

Где «u» и «v» — ОБА начальная вершина (я хочу, чтобы она начиналась и заканчивалась в одной и той же вершине), а значения «i» — это вершины, через которые она проходит по пути.

Это функция для DFS, которая у меня есть до сих пор, я упростил ее, чтобы ее можно было использовать в качестве общего справочника. Есть ли что-нибудь, что я могу изменить здесь, чтобы заставить это отображать то, что я хочу? (В настоящее время он не настроен для отображения чего-либо).

vector<Vertex*> vertices;
vector<Edge*> edges;

class Vertex {
    public:
        Vertex () {};
        Vertex (int id, float safetyIndex, string name)
            : id(id), safetyIndex(safetyIndex), name(name), previous(NULL), distFromStart(INT_MAX), color("white")
        {
            vertices.push_back(this);
        }
    public:
        int id;
        float safetyIndex;
        string name;
        int distFromStart;
        Vertex* previous;
        string color;
};

class Edge {
    public:
        Edge () {};
        Edge (Vertex* intersection1, Vertex* intersection2, int distance)
            : intersection1(intersection1), intersection2(intersection2), distance(distance)
        {
            edges.push_back(this);
        }
        bool street_connection(Vertex* intersection1, Vertex* intersection2)
        {
            return (
                (intersection1 == this->intersection1 && intersection2 == this->intersection2) ||
                (intersection1 == this->intersection2 && intersection2 == this->intersection1));
        }
    public:
        Vertex* intersection1;
        Vertex* intersection2;
        int distance;
};

void pathFinder(Vertex* startVertex)
{
    DFS_visit(startVertex); 
}

void DFS_visit(Vertex* u)
{
    u->color = "gray";  //  Mark that we have visited intersection 'u'

    //  Create a vector containing all adjacent vertices to intersection 'u'
    vector<Vertex*>* adjVertex = AdjVertices(u);

    const int size = adjVertex->size();
    for( int i=0; i<size; ++i)
    {
        Vertex* v = adjVertex->at(i);
        if ( v->color == "white" )
        {
            DFS_visit(v);  // recursive function call
        }
    }

    //  Once all adjacent vertices have been located, we are done with this node
    u->color = "black";
}

vector <Vertex*>* AdjVertices(Vertex* vert)
{
    //  Creates a vector containing all of the adjacent vertices
    //  to the intersection in question (vert)
    vector<Vertex*>* adjVertex = new vector <Vertex*> ();
    const int size = edges.size();
    for(int i=0; i<size; ++i)
    {
        Edge* edge = edges.at(i);
        Vertex* adjacent = NULL;
        if (edge->intersection1 == vert)    // if edge's start vertex is the vertex in question
        {
            adjacent = edge->intersection2;
        }
        else if (edge->intersection2 == vert)   // if edge's end vertex is the vertex in question
        {
            adjacent = edge->intersection1;
        }
        if (adjacent && vertices_check(vertices, adjacent))
        {
            adjVertex->push_back(adjacent);
        }
    }
    return adjVertex;
} 

person Norm    schedule 05.12.2012    source источник
comment
не могли бы вы опубликовать определение как Vertex, так и Edge?   -  person Rubens    schedule 06.12.2012
comment
Конечно, должно быть сейчас   -  person Norm    schedule 06.12.2012


Ответы (1)


Вы можете использовать вектор (созданный в другой вашей функции, вызывающей DFS_visit) и передать его в DFS_visit. В DFS_visit вы добавляете узел в начале, а затем каждый раз возвращаетесь из исследуемого дочернего элемента. Это должно дать вам полное описание пути.

void DFS_visit(Vertex* u, Vector<Vertex*> path )
{
    u->color = "gray";  //  Mark that we have visited intersection 'u'
    path.push_back(u);
    //  Create a vector containing all adjacent vertices to intersection 'u'
    vector<Vertex*>* adjVertex = AdjVertices(u);

    const int size = adjVertex->size();
    for( int i=0; i<size; ++i)
    {
        Vertex* v = adjVertex->at(i);
        if ( v->color == "white" )
        {
            DFS_visit(v,path);  // recursive function call
            path.push_back(u);
        }
    }

    //  Once all adjacent vertices have been located, we are done with this node
    u->color = "black";
}
person Origin    schedule 06.12.2012