Boost Graph Library 庫小結1


Boost Graph Library使用泛型的思想,完整的編寫了圖中的各類算法。比如廣搜,深搜,最短路徑等等

1.創建一個圖

1.1 圖的表示

圖可以有鄰接矩陣和鄰接表來表示,而在BGL中,則使用adjacency_listadjacency_matrix來表示,adjacency_list使用鄰接表來存儲一個圖,而adjacency_matrix使用鄰接矩陣來存儲,分別適用於點比較稀疏的圖和點比較密集的圖。使用鄰接表時可以使用以下定義:

 

1 typedef adjacency_list<listS, vecS, directedS> file_dep_graph;

 

 

其中listS表示將每個點的出邊存儲在std::list中,vecS表示將每個頂點存儲在std::vector

 

directedS表示該圖是有向圖。如果文件(file.dat)中有如下格式的輸入:

5

1 2

0 3

3 4

2 4

4 3

 

 

第一行表示頂點的個數,接下來幾行表示每條邊的起始頂點和終止頂點。那么可以結合標准輸入輸出流,以及adjacency_list來表示一個圖。代碼如下所示:

 1 std::ifstream file_in(“file.dat”);
2 typedef graph_traits<file_dep_graph>::vertices_size_type size_type;
3 size_type n_vertices;
4 file_in >> n_vertices;
5 std::istream_iterator<std::pair<size_type, size_type> > input_befin(file_in), input_end;
6 file_dep_graph g(input_begin, input_end, n_vertices);
7 //需要對operator >>進行重載
8 namespace std{
9 template <typename T>
10 std::istream& operator >>(std::istream& in, std::pair<T, T>& p){
11 in >> p.first >> p.second;
12 return in;
13 }
14 }

代碼中利用adjacency_list將文件中的輸入轉化為圖表示在了內存中。即g,有了圖在內存中的表示,那么就可以編寫代碼,對圖進行相關算法的編寫。

1.2圖中的迭代器

一般來說圖中的迭代器主要是鄰接迭代器,比如:如果想對某頂點的鄰接頂點(即出邊的尾頂點)進行迭代訪問,那么寫如下的代碼:

1 graph_traits<file_dep_graph>::adjacency_iterator vi, vi_end;
2 for(tie(vi, vi_end) = adjacent_vertices(u, g); vi != vi_end; ++vi)
3 std::cout<<*vi<<std::endl;

 

 

以上代碼表示對u所有的的鄰接頂點進行了一次迭代打印。

 

如果想對所有頂點進行遍歷可以如下編寫代碼:

1 graph_traits<file_dep_graph>::vertex_iterator vi, vi_end;
2 for(tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
3 std::cout<<*vi<<std::endl;

 

 

vertices返回對頂點的迭代器。其它迭代器可以具體參考BGL的用戶手冊。








 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM