广度优先搜索:有向图
Breadth First Search: Directed Graph
我正在尝试在有向图上实现 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 实现在:
#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程序,如果有什么遗漏,请多多指教。
提前感谢您的帮助。
你说的很对。当你添加 '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;
}
我正在尝试在有向图上实现 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 实现在:
#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程序,如果有什么遗漏,请多多指教。
提前感谢您的帮助。
你说的很对。当你添加 '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;
}