[英]BFS implementation C++
我試圖使用 Vertex 類和 BFS 類來實現 BFS,因為我想學習類的實現以及算法。
頂點.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
頂點.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文件
#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);
}
}
}
}
應用程序.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;
}
我面臨的問題是我在 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 設置鄰居,而是為主中的 v2 設置鄰居。
最快的解決方案是在 main 中向上定義圖形。 但是更好的解決方案是傳遞指針而不是實際實例以避免復制,這會更改所有代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.