2

グラフ G から隣接する頂点 w を削除したい.

私のコード:

// 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を削除しようとしました。

ただし、プログラムの開始中にいくつかの例外とエラーが発生します。

グラフからすべての隣人を削除し、頂点 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

- ループは 1 回の反復後に終了します。

4

1 に答える 1

5

こちらをご覧ください。remove_vertexエッジは変更されません。clear_vertex最初にそれをする必要があります。

一般的なヒント:boost::graphライブラリへの修飾された呼び出しを使用しないでください。修飾されていないものと呼びます。また、このような単純なケースで反復を処理するためにBoost.Rangeをお勧めします。それはスコープをよりきれいに保ち、よりきれいにします。

于 2012-04-24T19:52:25.383 に答える