Boost Graph Library (BGL) 介紹與使用示例
Boost Graph Library (BGL) 是 Boost 庫中用于圖論計算的模塊,提供了處理圖數據結構的通用接口和多種圖算法實現。
BGL 主要特性
- 提供多種圖表示方式:鄰接表、鄰接矩陣等
- 包含常用圖算法:DFS、BFS、最短路徑、最小生成樹等
- 高度可擴展的通用接口
- 支持有向圖和無向圖
基本使用方法
1. 包含頭文件
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
using namespace boost;
2. 圖的表示
最常用的是 adjacency_list
,它提供了靈活的圖表示方式:
typedef adjacency_list<listS, vecS, directedS> Graph;
- 第一個模板參數:邊的存儲方式(listS, setS, vecS等)
- 第二個模板參數:頂點的存儲方式
- 第三個模板參數:有向(directedS)或無向(undirectedS)
示例代碼
示例1:創建圖并添加頂點和邊
#include <iostream>
#include <boost/graph/adjacency_list.hpp>using namespace boost;int main() {// 定義圖類型 - 使用vector存儲頂點,list存儲邊,有向圖typedef adjacency_list<listS, vecS, directedS> Graph;// 創建圖對象Graph g;// 添加頂點auto v1 = add_vertex(g);auto v2 = add_vertex(g);auto v3 = add_vertex(g);auto v4 = add_vertex(g);// 添加邊add_edge(v1, v2, g);add_edge(v2, v3, g);add_edge(v3, v4, g);add_edge(v4, v1, g);add_edge(v1, v3, g);// 輸出圖的基本信息std::cout << "Number of vertices: " << num_vertices(g) << "\n";std::cout << "Number of edges: " << num_edges(g) << "\n";return 0;
}
示例2:圖的遍歷(BFS)
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/breadth_first_search.hpp>using namespace boost;int main() {typedef adjacency_list<vecS, vecS, undirectedS> Graph;Graph g;// 添加頂點和邊auto v0 = add_vertex(g);auto v1 = add_vertex(g);auto v2 = add_vertex(g);auto v3 = add_vertex(g);add_edge(v0, v1, g);add_edge(v0, v2, g);add_edge(v1, v3, g);add_edge(v2, v3, g);// 定義訪問器來記錄遍歷順序std::vector<default_color_type> colors(num_vertices(g));// 從頂點v0開始BFSbreadth_first_search(g, v0, visitor(make_bfs_visitor(record_distances(&colors[0], on_tree_edge())));// 輸出遍歷結果for (size_t i = 0; i < colors.size(); ++i) {std::cout << "Vertex " << i << " has distance " << colors[i] << "\n";}return 0;
}
示例3:Dijkstra最短路徑算法
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>using namespace boost;int main() {typedef adjacency_list<listS, vecS, directedS, no_property, property<edge_weight_t, int>> Graph;typedef graph_traits<Graph>::vertex_descriptor Vertex;// 創建圖Graph g;// 添加頂點Vertex v0 = add_vertex(g);Vertex v1 = add_vertex(g);Vertex v2 = add_vertex(g);Vertex v3 = add_vertex(g);// 添加帶權重的邊add_edge(v0, v1, 1, g);add_edge(v0, v2, 4, g);add_edge(v1, v2, 2, g);add_edge(v1, v3, 5, g);add_edge(v2, v3, 1, g);// 存儲距離和前驅節點std::vector<Vertex> predecessors(num_vertices(g));std::vector<int> distances(num_vertices(g));// 計算從v0到其他頂點的最短路徑dijkstra_shortest_paths(g, v0,predecessor_map(&predecessors[0]).distance_map(&distances[0]));// 輸出結果for (size_t i = 0; i < num_vertices(g); ++i) {std::cout << "Distance from v0 to v" << i << " = " << distances[i] << "\n";std::cout << "Predecessor of v" << i << " = v" << predecessors[i] << "\n";}return 0;
}
示例4:拓撲排序
#include <iostream>
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/topological_sort.hpp>using namespace boost;int main() {typedef adjacency_list<vecS, vecS, directedS> Graph;Graph g;// 添加頂點auto v0 = add_vertex(g);auto v1 = add_vertex(g);auto v2 = add_vertex(g);auto v3 = add_vertex(g);// 添加邊(表示依賴關系)add_edge(v0, v1, g);add_edge(v1, v2, g);add_edge(v2, v3, g);add_edge(v0, v3, g);// 存儲排序結果std::vector<Graph::vertex_descriptor> sorted_vertices;// 執行拓撲排序topological_sort(g, std::back_inserter(sorted_vertices));// 輸出排序結果(注意是逆序)std::cout << "Topological order (reverse): ";for (auto v : sorted_vertices) {std::cout << v << " ";}std::cout << "\n";return 0;
}
編譯與鏈接
使用Boost Graph Library需要鏈接Boost庫,編譯時通常需要添加以下選項:
g++ your_program.cpp -o your_program -lboost_graph
對于較新版本的Boost,可能需要使用:
g++ your_program.cpp -o your_program -lboost_graph -lboost_system
BGL提供了豐富的圖論算法和靈活的數據結構,適用于各種圖論問題的求解。更多高級功能可以參考Boost官方文檔。