BFS的STL实现:访问邻接列表时出现问题

时间:2014-07-21 00:18:49

标签: c++ graph stl

您好我在使用C ++中的STL库实现BFS时遇到问题。 以下实现存在以下问题:除源节点之外的所有节点的邻接列表都是空的,这在访问源和立即连接到它的节点之后终止遍历。

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

class GraphNode {
    private:
        string data;
        list<GraphNode> adj_list;
        bool visited;
    public:
        // Add a constructor
        GraphNode()
        {
            visited=false;
        }
        GraphNode(string input_data)
        {
            data=input_data;
            visited=false;
        }
        // Add a neighbour to the node
        void add_edge(GraphNode input_node)
        {
            adj_list.push_back(input_node);
        }
        string return_data()
        {
            return data;
        }
        void visit()
        {
            cout<<data<<endl;
            visited=true;
        }
        bool get_visit()
        {
            return visited;
        }
        list<GraphNode> *return_adj_list()
        {
            return &adj_list;
        }

};

void BreadthFirstSearch(GraphNode g)
{
        queue<GraphNode> bfs_queue;
        //list<GraphNode> adj_list;

        GraphNode node;
        g.visit();
        bfs_queue.push(g);
        while (bfs_queue.empty()==false)
        {
            node=bfs_queue.front();
            bfs_queue.pop();
            list<GraphNode> *adj_list=node.return_adj_list();
            //cout<<node.return_data()<<":";
            for (list<GraphNode>::iterator adj_list_iter=adj_list->begin();adj_list_iter!=adj_list->end();adj_list_iter++)
            {   //cout<<adj_list_iter->return_data()<<",";
                if (!adj_list_iter->get_visit())
                {
                    adj_list_iter->visit();
                    bfs_queue.push(*adj_list_iter);
                }
            }
            //cout<<endl;
        }
}

int main()
{
    GraphNode A=GraphNode("A");
    GraphNode B=GraphNode("B");
    GraphNode C=GraphNode("C");
    GraphNode D=GraphNode("D");
    GraphNode E=GraphNode("E");
    GraphNode F=GraphNode("F");
    A.add_edge(B);
    A.add_edge(C);
    B.add_edge(C);
    C.add_edge(E);
    E.add_edge(F);
    E.add_edge(D);
    D.add_edge(C);


    BreadthFirstSearch(A);
    return -1;
}

1 个答案:

答案 0 :(得分:2)

add_edge制作副本。将B添加到main后对A中所做的更改不会更改A中的副本。