在C ++ STL中使用CLRS实现广度优先搜索

时间:2015-02-09 13:42:23

标签: c++ stl breadth-first-search

我正在尝试实现CLRS中提供的广度优先搜索算法。我是STL的新手,需要帮助才能添加边缘功能。在这里,我试图推动adjency列表中的节点。

enum eNodecolor{
    WHITE,
    GREY,
    BLACK
};

struct sVertex{
    int        m_iValue;
    eNodecolor m_visited;

public:

    sVertex(int iValue) {
        m_iValue = iValue;
    }


};


class CGraph {
private:

    std::map<sVertex, vector<sVertex*> > m_mapAdjList;
    int m_iNoOfVertices;

public:

    CGraph(int iNoOfVertices) {
        m_iNoOfVertices = iNoOfVertices;

    }

    void addEdge(int iDataForSource,  int iDataForDestination);

    ~CGraph(void){}

    void bfs();
};

/* user will call function add edge with source data and destination data. */

void CGraph::addEdge(int iDataForSource, int iDataForDestination) {



        // check if vertex exists in map if not create it
        // Question: How can I check here if data for source exists in map. 
        // if not exists create vertex
    sVertex* src = new sVertex(iDataForSource);
    sVertex* dst = new sVertex(iDataForDestination);
    vector<sVertex*> edge(m_iNoOfVertices);
    edge.push_back(dst);
    src->m_visited = WHITE;

    std::pair<std::map<sVertex, vector<sVertex*> >::iterator,bool> ret;

    m_mapAdjList.insert(pair<sVertex,vector<sVertex*> >(*src,edge));



    ret = m_mapAdjList.insert ( std::pair<sVertex, vector<sVertex*> >(src, dst) );

}

}

如何在C ++中使用STL实现附件列表?

问题是我的初步设计是对的吗? 如果没有指导我正确的方向。

提供示例代码

由于

1 个答案:

答案 0 :(得分:0)

我在您的实现中看到了两件事

  • 您使用动态内存,但这不是必需的。只需将顶点添加到std::vector

    即可
    std::map<sVertex, std::vector<sVertex> > m_mapAdjList;
    
  • 如果图表中已存在新条目,则始终创建新条目,覆盖旧条目。因此,首先检查图中是否已存在顶点。您的addEdge()可能看起来像

    void CGraph::addEdge(int iDataForSource, int iDataForDestination) {
        sVertex src(iDataForSource), dst(iDataForDestination);
        auto &edge = m_mapAdjList[src];
        edge.push_back(dst);
    }
    

    当然,您需要sVertex的适当比较运算符。