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.pswp.cn/news/901168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901168.shtml
英文地址,請注明出處:http://en.pswp.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}/…