最後更新:2014-12-25
來源:互聯網
上載者:User
關鍵字
開發人員
C++
Library
通用圖庫
關於計算的公理表達通常頗具爭論。 然而,現代計算最重要的理論支柱之一的圖論並不是這些公理表達之一。 無數工程領域(從設計路由器和網路到設計構成行動裝置核心的晶片)都是圖論的應用。
作為 C++++ 應用程式軟體HTTP://www.aliyun.com/zixun/aggregation/7155.html">開發人員,我們通常需要直接將實際工程問題轉化成一個等價的圖論問題。 如果有一個可靠的基於 C++ 的通用圖庫,就可以説明我們實現這個轉換,這樣的圖庫顯然非常受歡迎:Boost Graph Library (BGL) 將填補這項空白。
在本文中,您首先將創建一個無向圖,然後按照常規的遍歷常式創建一個有向圖。 隨後,您可以應用一些經典演算法,所有演算法都不需要添加大量代碼。 這就是 BGL 的神奇之處。
下載和安裝
BGL 可從 Boost 網站免費下載。 BGL 是一個僅有標頭檔的庫,因此,以後在應用程式代碼中使用該庫時,需要在原始程式碼中包含相關的標頭檔。 但是 BGL 需要這個序列化庫來進行連結。 以下是一個典型的命令列格式:
root# g++ test_bgl.cpp I/usr/boost/boost_1_44/ -L/usr/boost/boost_1_44/lib
如果要試驗本文中的代碼,您需要安裝 Boost 1.44 版本。
鄰接表(Adjacency lists)
任何圖實現的標頭檔中都有一個鄰接表 (adjacency list) 或鄰接矩陣。 清單 1 顯示了在 Boost 標頭檔 adjacency_list.hpp 中如何聲明鄰接表。
清單 1. 在 Boost 中聲明一個鄰接表
template <class OutEdgeListS = vecS, // a Sequence or an AssociativeContainer class VertexListS = vecS, // a Sequence o r a RandomAccessContainer class DirectedS = directedS, class VertexProperty = no_property, class EdgeProperty = no_propert y, class GraphProperty = no_property, class EdgeListS = listS> class adjacency_list { };
為了簡便起見,我們將重點放在前三個範本參數。
OutEdgeList 範本參數決定了將用於存儲邊清單( edge-list)資訊的容器類型。 回顧一下圖論基礎知識就可以知道,對於有向圖,只具有入邊的那些頂點都有一個對應的空鄰接表。 預設值被設置為 vecS,該值對應于 std::vector。 VertexList 範本參數決定了用於表示該圖頂點清單的容器類型,預設值同樣被設置為 std::vector。 DirectedS 範本參數根據提供的值是 directedS 還是 undirectedS 來確定該圖是有向圖還是無向圖。
在 BGL 中創建一個圖
在聲明鄰接表的同時,清單 2 中的代碼在 BGL 中創建了一個簡單的無向圖,邊資訊將存儲在 std::list 中,頂點資訊存儲在 std::vector 中。
清單 2. 創建一個無向圖
#include <boost/graph/adjacency_list.hpp> using namespace boost; typedef boost::adjacency_list<listS, vecS, undirectedS> mygraph; int main() { mygraph g; add_edge (0, 1, g); add_edge (0, 3, g); add_edge (1, 2, g); add_edge (2, 3, g); }
在清單 2 中,在沒有在建構函式中提供任何頂點或邊資訊的情況下創建了圖 g。 在運行的時候,會使用諸如 add_edge 和 add_vertex 之類的説明函數創建邊和頂點。 add_edge 函數,顧名思義:在一個圖的兩個頂點之間添加一條邊。 清單 2 中的代碼執行結束後,圖 g 應該有 4 個頂點,分別標記為 0、1、2 和 3,頂點 1 與頂點 0 和頂點 2 連接,等等。