BFS 实现 C++
BFS implementation C++
我尝试使用 Vertex classes 和 BFS class 来实现 BFS,因为我想学习 classes 的实现以及算法。
vertex.h
#ifndef vertex_H_
#define vertex_H_
#include<vector>
class Vertex{
private:
int _data;
bool _visited;
std::vector<Vertex> _neighbours;
public:
Vertex(int data);
Vertex();
void setData(int data);
int getData();
bool isVisited();
void setVisited(bool visited);
std::vector<Vertex> getNeighbours();
void setNeighbours(std::vector<Vertex>& neighbours);
void addNeighbourVertex(Vertex& vertex);
~Vertex();
};
#endif
vertex.cpp
#include "vertex.h"
Vertex::Vertex(int data):_data(data){}
Vertex::Vertex(){}
Vertex::~Vertex(){}
void Vertex::setData(int data){
_data = data;
}
int Vertex::getData(){
return _data;
}
void Vertex::setVisited(bool visited){
_visited=visited;
}
bool Vertex::isVisited(){
return _visited;
}
std::vector<Vertex> Vertex::getNeighbours(){
return _neighbours;
}
void Vertex::setNeighbours(std::vector<Vertex>& neighbours){
_neighbours = neighbours;
}
void Vertex::addNeighbourVertex(Vertex& vertex){
_neighbours.push_back(vertex);
}
BFS.h
#ifndef BFS_H_
#define BFS_H_
#include "vertex.h"
class BFS{
public:
void bfs(Vertex& root);
};
#endif
BFS.cpp
#include<iostream>
#include<vector>
#include"vertex.h"
#include<deque>
#include"BFS.h"
void BFS::bfs(Vertex& root)
{
std::deque<Vertex> Q;
root.setVisited(true);
Q.push_back(root);
while(!Q.empty())
{
Vertex select_node = Q.front();
Q.pop_front();
std::cout<<select_node.getData()<<" "<<std::endl;
for(Vertex node : select_node.getNeighbours())
{
if (!node.isVisited())
{
node.setVisited(true);
Q.push_back(node);
}
}
}
}
application.cpp
#include<iostream>
#include "BFS.h"
#include "vertex.h"
int main(){
BFS bfs;
Vertex v1(1);
Vertex v2(2);
Vertex v3(3);
Vertex v4(4);
Vertex v5(5);
v1.addNeighbourVertex(v2);
v1.addNeighbourVertex(v4);
v4.addNeighbourVertex(v5);
v2.addNeighbourVertex(v3);
bfs.bfs(v1);
return 0;
}
- getNeighbours function from vertex class获取特定顶点的相邻顶点向量。
我面临的问题是我定义的 application.cpp 中的图表 .
顶点 1-> 顶点{2,4}
顶点 2-> 顶点{3}
顶点 3-> 顶点{2}
顶点 4-> 顶点{5}
顶点 5-> 顶点{4}
预期输出为:
1个
2个
4个
3个
5
我的输出:
1个
2个
4
我真的很想得到一些帮助..有些东西我在这里看不到,因此没有得到正确的输出。
您正在使用 Vertex
的容器。考虑一下。想想浅拷贝。
Vertex v1(1);
Vertex v2(2);
Vertex v3(3);
Vertex v4(4);
Vertex v5(5);
到目前为止,还不错。你有 5 个顶点,每个顶点都没有邻居。
v1.addNeighbourVertex(v2);
v1.addNeighbourVertex(v4);
现在 v1 的 _neighbours
成员包含 v2 和 v4 的 副本。
v4.addNeighbourVertex(v5);
v2.addNeighbourVertex(v3);
是的,很好,但是 v1 的 _neighbours
成员中包含的节点仍然没有邻居。
bfs.bfs(v1);
这使您可以搜索 v1 及其“邻居”,即 v2 和 v4 的无邻居副本:
1 2 4
如果你存储指针到顶点,你的运气会更好。
发生这种情况是因为您在各处复制节点和向量。这里的特殊问题是您创建了 v1 和 v2,然后通过将 v2 推到 v1._neighbors 上将 v1 附加到 v2。这是 v2 的副本,不是原版!那么您为 v2 设置了邻居,但是您设置的邻居不是 v1._neighbors 中的 v2,而是 main 中的 v2。
最快的解决办法是在main中向上定义图。但更好的解决方案是传递指针而不是实际实例以避免复制,这会更改所有代码。
我尝试使用 Vertex classes 和 BFS class 来实现 BFS,因为我想学习 classes 的实现以及算法。
vertex.h
#ifndef vertex_H_
#define vertex_H_
#include<vector>
class Vertex{
private:
int _data;
bool _visited;
std::vector<Vertex> _neighbours;
public:
Vertex(int data);
Vertex();
void setData(int data);
int getData();
bool isVisited();
void setVisited(bool visited);
std::vector<Vertex> getNeighbours();
void setNeighbours(std::vector<Vertex>& neighbours);
void addNeighbourVertex(Vertex& vertex);
~Vertex();
};
#endif
vertex.cpp
#include "vertex.h"
Vertex::Vertex(int data):_data(data){}
Vertex::Vertex(){}
Vertex::~Vertex(){}
void Vertex::setData(int data){
_data = data;
}
int Vertex::getData(){
return _data;
}
void Vertex::setVisited(bool visited){
_visited=visited;
}
bool Vertex::isVisited(){
return _visited;
}
std::vector<Vertex> Vertex::getNeighbours(){
return _neighbours;
}
void Vertex::setNeighbours(std::vector<Vertex>& neighbours){
_neighbours = neighbours;
}
void Vertex::addNeighbourVertex(Vertex& vertex){
_neighbours.push_back(vertex);
}
BFS.h
#ifndef BFS_H_
#define BFS_H_
#include "vertex.h"
class BFS{
public:
void bfs(Vertex& root);
};
#endif
BFS.cpp
#include<iostream>
#include<vector>
#include"vertex.h"
#include<deque>
#include"BFS.h"
void BFS::bfs(Vertex& root)
{
std::deque<Vertex> Q;
root.setVisited(true);
Q.push_back(root);
while(!Q.empty())
{
Vertex select_node = Q.front();
Q.pop_front();
std::cout<<select_node.getData()<<" "<<std::endl;
for(Vertex node : select_node.getNeighbours())
{
if (!node.isVisited())
{
node.setVisited(true);
Q.push_back(node);
}
}
}
}
application.cpp
#include<iostream>
#include "BFS.h"
#include "vertex.h"
int main(){
BFS bfs;
Vertex v1(1);
Vertex v2(2);
Vertex v3(3);
Vertex v4(4);
Vertex v5(5);
v1.addNeighbourVertex(v2);
v1.addNeighbourVertex(v4);
v4.addNeighbourVertex(v5);
v2.addNeighbourVertex(v3);
bfs.bfs(v1);
return 0;
}
- getNeighbours function from vertex class获取特定顶点的相邻顶点向量。
我面临的问题是我定义的 application.cpp 中的图表 .
顶点 1-> 顶点{2,4}
顶点 2-> 顶点{3}
顶点 3-> 顶点{2}
顶点 4-> 顶点{5}
顶点 5-> 顶点{4}
预期输出为: 1个 2个 4个 3个 5
我的输出: 1个 2个 4
我真的很想得到一些帮助..有些东西我在这里看不到,因此没有得到正确的输出。
您正在使用 Vertex
的容器。考虑一下。想想浅拷贝。
Vertex v1(1);
Vertex v2(2);
Vertex v3(3);
Vertex v4(4);
Vertex v5(5);
到目前为止,还不错。你有 5 个顶点,每个顶点都没有邻居。
v1.addNeighbourVertex(v2);
v1.addNeighbourVertex(v4);
现在 v1 的 _neighbours
成员包含 v2 和 v4 的 副本。
v4.addNeighbourVertex(v5);
v2.addNeighbourVertex(v3);
是的,很好,但是 v1 的 _neighbours
成员中包含的节点仍然没有邻居。
bfs.bfs(v1);
这使您可以搜索 v1 及其“邻居”,即 v2 和 v4 的无邻居副本:
1 2 4
如果你存储指针到顶点,你的运气会更好。
发生这种情况是因为您在各处复制节点和向量。这里的特殊问题是您创建了 v1 和 v2,然后通过将 v2 推到 v1._neighbors 上将 v1 附加到 v2。这是 v2 的副本,不是原版!那么您为 v2 设置了邻居,但是您设置的邻居不是 v1._neighbors 中的 v2,而是 main 中的 v2。
最快的解决办法是在main中向上定义图。但更好的解决方案是传递指针而不是实际实例以避免复制,这会更改所有代码。