您好我在使用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;
}
答案 0 :(得分:2)
add_edge
制作副本。将B
添加到main
后对A
中所做的更改不会更改A
中的副本。