2012-04-24 85 views
2

我想刪除一個頂點W和他的鄰居從圖G刪除頂點和他的鄰居們從c。將圖形++ Boost庫

我的代碼:

// remove all neighbours 
MyGraph::adjacency_iterator n_iter, n_end; 
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter) 
{ 
    boost::remove_vertex(*n_iter, G1); 
} 

MyGraph::vertex_iterator vertex_iter, vertex_end; 
Vertex vertex_w = G[*w]; 

// remove vertex himself 
for (tr1::tie(vertex_iter, vertex_end) = boost::vertices(G1);vertex_iter != vertex_end; ++vertex_iter) 
{ 
    Vertex vertex = G1[*vertex_iter]; 
    if (vertex.p_index == vertex_w.p_index) 
    { 
     boost::remove_vertex(*vertex_iter, G1); 
     break; 
    } 
} 

我試圖遍歷相鄰的頂點並刪除它們。之後,我試圖刪除頂點w。

但是在啓動程序時出現了一些異常和錯誤。

有人給我一個暗示,讓我從圖中刪除和Vertex w與他所有的鄰居?

更新: 現在我明白爲什麼上面的代碼將無法正常工作(我正在使用VertexList = vecS)。我現在嘗試將頂點標記爲「已移除」並且想要移除所有邊緣。

格拉夫:

0  1 
o-----o 
|  | 
|  | 
o-----o 
2  3 

代碼:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS, Vertex, Edge> MyGraph; 
[...] 
// *w is Vertex "1" 
boost::graph_traits<MyGraph>::adjacency_iterator n_iter, n_end, next; 
for (tr1::tie(n_iter, n_end) = boost::adjacent_vertices (*w, G1); n_iter != n_end; ++n_iter) 
{ 
    cout << G1[*n_iter].p_index << endl; 
    G1[*n_iter].Graph_Part = Graph_Part::R; 
    // boost::clear_vertex(*n_iter, G1); <-- problem 
} 
cout << endl << "----" << endl; 

如果我取消對clear_vertex的方法,所述輸出爲:

0 
3 

如果程序除去* n_iter的邊緣,輸出僅爲:

0 

- 循環在一次迭代後結束。

回答

5

看一看hereremove_vertex不會改變任何邊緣。你首先需要clear_vertex

一般提示:不要使用合格的來電來boost::graph庫,給他們打電話不合格。我還建議Boost.Range在這種簡單的情況下處理迭代。它保持範圍更清潔並且更漂亮。

+0

嗨,我已經更新了我的問題。如果你能看看更新,我很感激。 – take 2012-04-25 16:54:10

+0

在這種情況下使用不合格呼叫有什麼好處?我知道'交換'等,但不是在這裏。 – user1520427 2013-11-30 01:02:14

+0

@ user1520427 BGL的擴展方式與'std :: swap'大致相同。如果您將自己的數據結構調整爲Graph,您將在與數據結構相同的名稱空間中添加額外的函數。 – pmr 2013-11-30 12:22:58

相關問題