Boost Graph Library (BGL) 介绍与使用示例
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开始BFS
breadth_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官方文档。