6

Boostグラフライブラリを使用しようとしていますが、boost :: edge()を使用しようとするとセグメンテーション違反が発生します。完全なコードはここから入手できますが、ここで同じ問題のある最小限のプログラムを作成しました( "g ++ minimum.cpp"でコンパイルしています)。

#include<stdio.h>
#include<boost/graph/adjacency_list.hpp>

using namespace boost;
using namespace std;

typedef adjacency_list<> graph_t;
typedef graph_traits<graph_t>::edge_descriptor edge_descriptor;

int main(){
    graph_t G;
    //add_edge(1,3,G);
    //remove_edge(1,3,G);
    pair<edge_descriptor, bool> res = edge(1,3,G);
    printf("G does %shave an edge 1->3\n", res.second ? "" : "not ");
    return 0;
}

add_edge、remove_edge行のコメントを外すと、セグメンテーション違反は発生せず、プログラムは期待どおりの結果を出力します。

G does not have an edge 1->3

しかし、そのようなハッカーを回避する方法はありますか?ありがとう!

4

1 に答える 1

1

どうやら、add_edge(1,3,G)呼び出しは必要に応じてグラフに頂点を追加します。その場合、最初の呼び出しはです。次に、頂点1から頂点3にエッジを追加します。この呼び出しの後、頂点の数は4になります。これは、頂点が0から3にインデックス付けされるためです。

の後続の呼び出しremove_edge(1,3,G)は、追加されたばかりのエッジを削除しますが、頂点の数は変更されません。

一方、への呼び出しedge(1,3,G)はグラフに頂点を追加しません。戻り値のブール値は、頂点1と3が接続されているかどうかを示します。add_edgeインデックス1と3の頂点が存在しないため、を削除するとアクセス違反が発生します。

必要な数の頂点でグラフを初期化するだけです。

graph_t G(4);
于 2013-09-16T14:29:29.313 に答える