簡體   English   中英

如何使用boost圖形庫廣度優先搜索創建遍歷頂點隊列?

[英]How do I create a queue of traversed vertex using boost graph library breadth-first search?

我想使用 boost 圖形庫廣度優先搜索來返回從節點 1 開始時訪問的頂點隊列。我閱讀了文檔,但仍然無法理解如何實現這一點。

下面的結果將按順序返回一個隊列:1,2,3,4 或 1,3,2,4

typedef boost::property<boost::edge_weight_t, unsigned int> EdgeWeightProperty;
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS, 
                              boost::no_property, EdgeWeightProperty> Graph;

//create graph and add edge
Graph g;
boost::add_edge(1,2,6,g);
boost::add_edge(2,3,6,g);
boost::add_edge(3,1,6,g);
boost::add_edge(3,4,6,g);

//Perform breadth first using boost and return result in a queue.

boost 圖形庫文檔定義了一個BFS 訪問者概念,該概念指出

用戶可以使用 BFS 訪問者接口定義一個類,並將該類的對象傳遞給breadth_first_search() ,從而增加圖搜索期間采取的操作。

基於此和bfs.cpp示例,完成您所要求的首選方法是子類化boost::visitorboost::default_bfs_visitor並覆蓋其中的一個或幾個

  • initialize_vertex
  • discover_vertex
  • examine_vertex
  • examine_edge
  • tree_edge
  • non_tree_edge
  • gray_target
  • black_target
  • finish_vertex

對於您的用例,我會說最適合子類化boost::default_bfs_visitor並覆蓋discover_vertex

discover_vertex(s, g)

第一次遇到頂點時調用。 sboost::graph_traits<Graph>::vertex_descriptor類型的對象, gGraph類型的對象。

這是一個具體如何做到這一點的示例,通過適當處理std::queue對象來記錄頂點。

#include <queue>
#include <iostream>
#include <boost/graph/visitors.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/breadth_first_search.hpp>

typedef boost::property<boost::edge_weight_t, unsigned int> EdgeWeightProperty;
typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS, 
                              boost::no_property, EdgeWeightProperty> Graph;

class BFSVisitor : public boost::default_bfs_visitor {
public:    
    BFSVisitor(std::queue<Graph::vertex_descriptor>& _visited) : visited(_visited){}
    void discover_vertex(Graph::vertex_descriptor s, const Graph &g) { visited.push(s); }
    std::queue<Graph::vertex_descriptor>& visited;
};

int main() {
    Graph g;
    boost::add_edge(0,1,6,g);
    boost::add_edge(1,2,6,g);
    boost::add_edge(2,3,6,g);
    boost::add_edge(3,1,6,g);
    boost::add_edge(3,4,6,g);

    Graph::vertex_descriptor s = *(boost::vertices(g).first);
    std::queue<Graph::vertex_descriptor> q;
    BFSVisitor vis(q);
    boost::breadth_first_search(g, s, boost::visitor(vis));
    while (!vis.visited.empty()) {
        std::cout << vis.visited.front() << std::endl;
        vis.visited.pop();
    }
}

這將輸出

0
1
2
3
4

注意- Boost 期望圖從頂點0開始,而不是1 - 因此這條線

boost::add_edge(0,1,6,g);

如果從頂點1開始,將沒有輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM