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
- 循環在一次迭代後結束。
嗨,我已經更新了我的問題。如果你能看看更新,我很感激。 – take 2012-04-25 16:54:10
在這種情況下使用不合格呼叫有什麼好處?我知道'交換'等,但不是在這裏。 – user1520427 2013-11-30 01:02:14
@ user1520427 BGL的擴展方式與'std :: swap'大致相同。如果您將自己的數據結構調整爲Graph,您將在與數據結構相同的名稱空間中添加額外的函數。 – pmr 2013-11-30 12:22:58