Поиск в ширину: Направленный график

0

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

Файл Graph.CPP:

#include<iostream>
#include <list>
using namespace std;

class node{
    int value;
    int color;


    public:
        list <node> adj;
        node(int val){
            value = val;
            color = 0;
        }

        void add_edge(node x){
            adj.push_back(x);
        }

        void change_color(int c){
            color = c;
        }

        int get_color(){
            return color;
        }

        int get_value(){
            return value;
        }
};

И фактическая реализация BFS IN:

#include "graph.cpp"
node n0(0),n1(1),n2(2),n3(3), n4(4);

//PrintQ: Print the list
void printq( list <node> A){
    while (!A.empty())
    {
        cout << A.front().get_value() <<" ";
        A.pop_front();
    }
}

void bfs(node s){
    list <node> q;
    q.push_back(s);
    s.change_color(1);

    while(!q.empty()){
        node s = q.front();

        cout<<s.get_value()<<'\t';
        printq(s.adj);      
        cout<<endl;

        list<node>::iterator i;
        for(i = s.adj.begin(); i != s.adj.end(); ++i){

            if((*i).get_color() == 0){
                q.push_back(*i);
                (*i).change_color(1);
            }
        }

        q.pop_front();
    }

}
int main(){

    n0.add_edge(n1);
    n0.add_edge(n2);
    n1.add_edge(n2);
    n2.add_edge(n0);
    n2.add_edge(n3);
    n0.add_edge(n3);
    n1.add_edge(n4);
    n4.add_edge(n3);
/*  
    printq(n0.adj);cout<<endl;
    printq(n1.adj);cout<<endl;
    printq(n2.adj);cout<<endl;
*/
    bfs(n1);

    return 0;

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

Я не уверен, почему это происходит, хотя я подозреваю, что это связано с копией узлов по значению, а не ссылкой.

Это моя программа CPP после долгого перерыва, поэтому, если мне что-то не хватает, пожалуйста, просветите меня.

Благодарим за помощь заранее.

  • 0
    « Я подозреваю, что это связано с копированием узлов по значению, а не по ссылке », - думаю, вы ответили на свой вопрос.
Теги:
breadth-first-search

1 ответ

0
Лучший ответ

вы точно указали проблему. Когда вы добавляете 'n1.add_edge (n2);', n2 не имеет никакого ребра, а n1 будет хранить копию n2. Позже, когда вы добавляете больше ребер в n2, копия n1 не изменяется. Я изменил ваш код, чтобы использовать указатели, и я думаю, что он работает правильно.

#include<iostream>
#include <list>
using namespace std;
class node{
    int value;
    int color;


    public:
        list <node * > adj;
        node(int val){
            value = val;
            color = 0;
        }

        void add_edge(node * x){
            adj.push_back(x);
        }

        void change_color(int c){
            color = c;
        }

        int get_color(){
            return color;
        }

        int get_value(){
            return value;
        }
};

и ваш основной файл

#include "graph.cpp"

//PrintQ: Print the list
void printq( list <node *> A){
    while (!A.empty())
    {
        cout << A.front()->get_value() <<" ";
        A.pop_front();
    }
}

void bfs(node * s){
    list <node *> q;
    q.push_back(s);
    s->change_color(1);

    while(!q.empty()){
        node * s = q.front();

        cout<<s->get_value()<<'\t';
        printq(s->adj);      
        cout<<endl;

        list<node * >::iterator i;
        for(i = s->adj.begin(); i != s->adj.end(); ++i){

            if((*i)->get_color() == 0){
                q.push_back(*i);
                (*i)->change_color(1);
            }
        }

        q.pop_front();
    }

}
int main(){

    node* n0 = new node(0);
    node* n1 = new node(1);
    node* n2 = new node(2);
    node* n3 = new node(3);
    node* n4 = new node(4);

    n0->add_edge(n1);
    n0->add_edge(n2);
    n1->add_edge(n2);
    n2->add_edge(n0);
    n2->add_edge(n3);
    n0->add_edge(n3);
    n1->add_edge(n4);
    n4->add_edge(n3);
/*  
    printq(n0.adj);cout<<endl;
    printq(n1.adj);cout<<endl;
    printq(n2.adj);cout<<endl;
*/
    bfs(n1);
    delete n0, n1, n2, n3, n4;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню