首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BFS实现C++

BFS实现C++
EN

Stack Overflow用户
提问于 2020-08-24 17:54:05
回答 2查看 385关注 0票数 0

我试图使用顶点类和BFS类来实现BFS,因为我想学习类的实现以及算法。

顶点.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#ifndef BFS_H_
#define BFS_H_
#include "vertex.h"

class BFS{
    public:
        void bfs(Vertex& root);
        
};

#endif

BFS.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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函数得到特定顶点的相邻顶点的向量。

我面临的问题是,对于application.cpp中的图,我已经定义了

顶点1->顶点{2,4}

顶点2->顶点{3}

顶点3->顶点{2}

顶点4->顶点{5}

顶点5->顶点{4}

预期产出为:1 2 4 3 5

My输出:1 2 4

我真的很想得到一些帮助。有一些东西我在这里看不到,因此没有得到适当的输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-24 18:45:20

它之所以发生,是因为你在到处复制节点和向量。这里的特殊问题是您创建了v1和v2,然后通过将v2推到v1._neighbors上将v1附加到v2上。这是v2的副本,不是原件!然后为v2设置邻居,但不是为v1._neighbors中的v2设置邻居,而是主要为v2设置邻居。

最快的解决方案是在main中向上定义图。但是更好的解决方案是传递指针,而不是实际的实例,以避免复制,这将改变所有的代码。

票数 0
EN

Stack Overflow用户

发布于 2020-08-24 18:44:15

您使用的是Vertex容器。想想看。想想浅薄的拷贝。

代码语言:javascript
复制
Vertex v1(1);
Vertex v2(2);
Vertex v3(3);
Vertex v4(4);
Vertex v5(5);

到现在为止还好。你有5个顶点,每个顶点都没有邻居。

代码语言:javascript
复制
v1.addNeighbourVertex(v2);
v1.addNeighbourVertex(v4);

现在,_neighbours成员v1包含副本、 of v2和v4。

代码语言:javascript
复制
v4.addNeighbourVertex(v5);
v2.addNeighbourVertex(v3);

是的,很好,但是v1的_neighbours成员中包含的节点仍然是无邻域的。

代码语言:javascript
复制
bfs.bfs(v1);

这使您可以搜索v1及其“邻居”,即v2和v4的邻接副本:

代码语言:javascript
复制
1 2 4

如果你存储指向顶点的指针,你会有更好的运气。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63566242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档