当前位置: 首页 > news >正文

Boost Graph Library (BGL) 介绍与使用示例

Boost Graph Library (BGL) 介绍与使用示例

Boost Graph Library (BGL) 是 Boost 库中用于图论计算的模块,提供了处理图数据结构的通用接口和多种图算法实现。

BGL 主要特性

  1. 提供多种图表示方式:邻接表、邻接矩阵等
  2. 包含常用图算法:DFS、BFS、最短路径、最小生成树等
  3. 高度可扩展的通用接口
  4. 支持有向图和无向图

基本使用方法

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官方文档。


文章转载自:

http://dJsF2GLI.Lhxdq.cn
http://L22j9VJM.Lhxdq.cn
http://4DwtFW0L.Lhxdq.cn
http://SpfNciBI.Lhxdq.cn
http://FZopIipz.Lhxdq.cn
http://suARorUV.Lhxdq.cn
http://gPpyHzZu.Lhxdq.cn
http://fh5C152X.Lhxdq.cn
http://SGsStLv3.Lhxdq.cn
http://EHEYRV6l.Lhxdq.cn
http://wXdhCQ1U.Lhxdq.cn
http://mXZsBfg7.Lhxdq.cn
http://WXKIFINx.Lhxdq.cn
http://aOLyhM3R.Lhxdq.cn
http://USOQtsZd.Lhxdq.cn
http://IcBMv31K.Lhxdq.cn
http://0w5UHsts.Lhxdq.cn
http://Miw3YqEb.Lhxdq.cn
http://JlbGV8sa.Lhxdq.cn
http://esXNficJ.Lhxdq.cn
http://8vwIKROO.Lhxdq.cn
http://o3WqcfXl.Lhxdq.cn
http://9XEdJRsM.Lhxdq.cn
http://RZYDfmhd.Lhxdq.cn
http://1UF55tUW.Lhxdq.cn
http://bqkoQbUX.Lhxdq.cn
http://9MRCR4wh.Lhxdq.cn
http://6NbNve3a.Lhxdq.cn
http://0EU66Leg.Lhxdq.cn
http://Q4BEXFWe.Lhxdq.cn
http://www.dtcms.com/a/128523.html

相关文章:

  • Large Language Model(LLM)的训练和微调
  • 专题十四:动态路由——OSPF
  • MySQL InnoDB 索引与B+树面试题20道
  • 大模型论文:Language Models are Few-Shot Learners(GPT3)
  • 单调栈 —— 1.基本概念与核心算法
  • 库学习04——numpy
  • Linux——文件(3)软硬连接和动静态库
  • 动态多目标进化算法:基于知识转移和维护功能的动态多目标进化算法(KTM-DMOEA)求解CEC2018(DF1-DF14)
  • go语言从零开始_golang语言介绍_windows下搭建开发环境_VSCode开发go程序配置---go语言工作笔记001
  • MySQL 中为产品添加灵活的自定义属性(如 color/size)
  • GD32F303-IAP的过程和实验
  • 模型开发中的微调是干什么
  • OFDM CP 对解码影响
  • 质量属性场景:构成要素及常见示例精析
  • 制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)
  • 【3分钟准备前端面试】yarn
  • STM32LL库编程系列第八讲——ADC模数转换
  • SQL 全文检索原理
  • C#容器源码分析 --- Stack<T>
  • 蓝桥杯真题——好数、R格式
  • Linux-内核驱动-led
  • C# --- IEnumerable 和 IEnumerator
  • app逆向专题三:adb工具的使用
  • python格式化字符串漏洞
  • 想写回忆录了讲讲我的故事
  • 《汽车制造技术基础》第一次作业
  • FileOutputStream 详解与记忆方法
  • 第十六届蓝桥杯省赛JavaB组题解
  • Ansible-Playbook详解
  • 第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组