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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv(C++)操作图像像素

文章目录 添加噪点的案例图像像素值1、访问图像属性2、像素访问方法 at灰度图像彩色图像 3、OpenCV 的向量类型4、 图像传递方式 The cv::Mat_ 类1、作用及优点2、使用 cv::Mat_ 简化像素访问 用指针扫描图像背景算法案例原理1. 图像数据存储的基本结构2、行填充&#xff08;Pa…

Python实现贪吃蛇一

贪吃蛇是一款经典的小游戏&#xff0c;最近尝试用Python实现它。先做一个基础版本实现以下目标&#xff1a; 1、做一个按钮&#xff0c;控制游戏开始 2、按Q键退出游戏 3、右上角显示一个记分牌 4、随机生成一个食物&#xff0c;蛇吃到食物后长度加一&#xff0c;得10分 5、蛇碰…

《AI大模型应知应会100篇》第13篇:大模型评测标准:如何判断一个模型的优劣

第13篇&#xff1a;大模型评测标准&#xff1a;如何判断一个模型的优劣 摘要 近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;在自然语言处理、代码生成、多模态任务等领域取得了显著进展。然而&#xff0c;随着模型数量和规模的增长&#xff0c;如何科学评估这些模…

工会考试重点内容有哪些:核心考点与备考指南

工会考试重点内容总结&#xff1a;核心考点与备考指南 工会考试主要考察考生对工会法律法规、职能职责、实务操作等内容的掌握程度&#xff0c;适用于企事业单位工会干部、社会化工会工作者等岗位的选拔。本文梳理工会考试的核心考点&#xff0c;帮助考生高效备考。 一、工会…

Verilog学习-1.模块的结构

module aoi(a,b,c,d,f);/*模块名为aoi&#xff0c;端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…

MySQL数据库备份与恢复详解

在数据库管理中&#xff0c;数据的备份与恢复是至关重要的一环。对于MySQL数据库&#xff0c;定期备份不仅能防止数据丢失&#xff0c;还能在发生故障时快速恢复数据库。本文将详细介绍MySQL数据库的备份与恢复方法&#xff0c;覆盖所有常用备份和恢复方式&#xff0c;帮助大家…

FFMPEG和opencv的编译

首先 sudo apt-get update -qq && sudo apt-get -y install autoconf automake build-essential cmake git-core libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-de…

华为机试—最大最小路

题目 对于给定的无向无根树&#xff0c;第 i 个节点上有一个权值 wi​ 。我们定义一条简单路径是好的&#xff0c;当且仅当&#xff1a;路径上的点的点权最小值小于等于 a &#xff0c;路径上的点的点权最大值大于等于 b 。 保证给定的 a<b&#xff0c;你需要计算有多少条简…

spring cloud微服务开发中声明式服务调用详解及主流框架/解决方案对比

声明式服务调用详解 1. 核心概念 定义&#xff1a;通过配置或注解声明服务调用逻辑&#xff0c;而非手动编写客户端代码&#xff0c;提升开发效率与可维护性。核心特性&#xff1a; 解耦&#xff1a;调用逻辑与业务代码分离内置容错&#xff1a;熔断、超时、重试等动态发现&am…

基于springboot+vue的秦皇岛旅游景点管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户登录 旅游路…

【数据结构】之二叉树

二叉树是我们在数据结构中学到的第一个非线性结构&#xff0c;是后续学习更为复杂的树、图结构的基础。本文整理了二叉树的概念定义、基本操作、遍历算法、伪代码与代码实现以及实例说明&#xff0c;方便大家随时查找对应。 一、定义与基本术语 二叉树是一种树形结构&#xf…

Honeyview:快速浏览各类图像

Honeyview是一款免费、轻量级图片查看工具‌&#xff0c;专为快速浏览各类图像设计&#xff0c;支持Windows系统‌。其核心优势在于‌极速加载‌与‌广泛格式兼容性‌&#xff0c;可替代系统自带的图片查看工具&#xff0c;尤其适合需要处理专业图像&#xff08;如PSD、RAW&…

Streamlit性能优化:缓存与状态管理实战

目录 &#x1f4cc; 核心特性 &#x1f4cc; 运行原理 &#xff08;1&#xff09;全脚本执行 &#xff08;2&#xff09;差异更新 &#x1f4cc; 缓存机制 ❓为什么使用缓存&#xff1f; 使用st.cache_data的优化方案 缓存适用场景 使用st.session_state的优化方案 &…

十七、TCP编程

TCP 编程是网络通信的核心&#xff0c;其 API 围绕面向连接的特性设计&#xff0c;涵盖服务端和客户端的交互流程。以下是基于 ​C 语言的 TCP 编程核心 API 及使用流程的详细解析&#xff1a; 核心 API 概览 ​函数​角色​描述socket()通用创建套接字&#xff0c;指定协议族…

将外网下载的 Docker 镜像拷贝到内网运行

将外网下载的 Docker 镜像拷贝到内网运行&#xff0c;可以通过以下步骤实现&#xff1a; 一、在有外网访问权限的机器上操作 下载镜像 使用docker pull命令下载所需的镜像。例如&#xff0c;如果你需要下载一个名为nginx的镜像&#xff0c;可以运行以下命令&#xff1a;docke…

《深入理解生命周期与作用域:以C语言为例》

&#x1f680;个人主页&#xff1a;BabyZZの秘密日记 &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、生命周期&#xff1a;变量的存在时间&#xff08;一&#xff09;生命周期的定义&#xff08;二&#xff09;C语言中的生命周期类型&#xff08;三&#…

Hqst的超薄千兆变压器HM82409S在Unitree宇树Go2智能机器狗的应用

本期拆解带来的是宇树科技推出的Go2智能机器狗&#xff0c;这款机器狗采用狗身体形态&#xff0c;前端设有激光雷达&#xff0c;摄像头和照明灯。在腿部设有12个铝合金精密关节电机&#xff0c;并配有足端力传感器&#xff0c;通过关节运动模拟狗的运动&#xff0c;并可做出多种…

壹起航:15年深耕,引领中国工厂出海新征程

在全球化浪潮汹涌澎湃的当下&#xff0c;中国工厂正以前所未有的热情和决心&#xff0c;将目光投向广阔的海外市场。然而&#xff0c;出海之路并非一帆风顺&#xff0c;建立品牌、获取稳定询盘、降低营销成本等难题&#xff0c;如同横亘在企业面前的高山&#xff0c;阻碍着他们…

【差分隐私相关概念】基础合成定理和高级合成技术简单关系

差分隐私中的合成定理用于分析多个机制组合时的隐私损失。基础合成定理和高级合成技术分别在不同场景下提供了隐私预算增长的估计&#xff0c;其关系如下&#xff1a; 基础合成定理&#xff08;线性增长&#xff09; 机制组合&#xff1a;当k个满足(ε, δ)-DP的机制按顺序组…

【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红

如图所示是我的clion项目目录 我自定义的data_structure.h和func_declaration.h在unit_test.c中无法检索到 cmakelists.txt配置文件如下所示&#xff1a; cmake_minimum_required(VERSION 3.30) project(noc C) #设置头文件的目录 include_directories(${CMAKE_SOURCE_DIR}/…