1

複数の最短パスを持つグラフがあり、頂点の ID とエッジの ID を取得したい:

igraph_get_all_shortest_paths(...)頂点のリストのみを計算します。

ではない

igraph_get_shortest_paths(&g, &vertices, &edges, from,igraph_vss_1(to), IGRAPH_ALL);

それをすることになっていますか?

私が実行すると:

igraph_t g1;
igraph_vector_t v1;
int ret;

/* Create a graph */
igraph_vector_init(&v1, 0);

igraph_create(&g1, &v1, 0, 0);
igraph_add_vertices(&g1, 1, 0);
igraph_add_vertices(&g1, 1, 0);
igraph_add_vertices(&g1, 1, 0);
igraph_add_vertices(&g1, 1, 0);
igraph_add_vertices(&g1, 1, 0);

igraph_add_edge(&g1,0,1);
igraph_add_edge(&g1,0,2);
igraph_add_edge(&g1,2,3);
igraph_add_edge(&g1,1,3);
igraph_add_edge(&g1,0,4);
igraph_add_edge(&g1,4,3);
igraph_add_edge(&g1,4,3);
igraph_add_edge(&g1,4,3);

igraph_vector_ptr_t verts;
igraph_vector_ptr_init(&verts, 2);


igraph_vector_ptr_t eds;
igraph_vector_ptr_init(&eds, 2);

igraph_vector_t v2;
igraph_vector_init(&v2,2);
VECTOR(v2)[0] = 3;
VECTOR(v2)[1] = 3;

igraph_vs_t tovs = igraph_vss_vector(&v2);

igraph_get_shortest_paths(&g1, &verts, &eds, 0, tovs , IGRAPH_ALL);
igraph_destroy(&g1);

次のエラーが表示されます: igraph_vector_clear: Assertion `v != ((void *)0)' failed

4

2 に答える 2

1

はい、そうすることになっています。igraph ホームページのドキュメントから:

[...]

vertices:

結果、パスに沿った頂点の ID。これはポインタ ベクトルで、各要素はベクトル オブジェクトを指します。これらは、関数に渡す前に初期化する必要があります。これにより、適切にクリアおよび/またはサイズ変更され、頂点から/への測地線に沿って頂点の ID が埋められます。これらのベクトルが必要ない場合は、ここにヌル ポインターを指定します。通常、この引数またはエッジは非 null である必要がありますが、両方が null ポインターの場合、エラーや警告は発生しません。

edges:

結果、パスに沿ったエッジの ID。これはポインタ ベクトルで、各要素はベクトル オブジェクトを指します。これらは、関数に渡す前に初期化する必要があります。これにより、適切にクリアおよび/またはサイズ変更され、頂点から/への測地線に沿って頂点の ID が埋められます。これらのベクトルが必要ない場合は、ここにヌル ポインターを指定します。通常、この引数または頂点は非 null である必要がありますが、両方が null ポインターである場合でもエラーや警告は発生しません。

[...]

したがって、パスに沿った頂点は に返されvertices、パスに沿ったエッジは に返されedgesます。

編集

ソースコードを追加したようです。ドキュメントにあるように、この関数を呼び出す前に、ポインター ベクトル内のベクトルを割り当てて初期化する必要があります。これは他の igraph 関数とは異なるため、やや奇妙ですが、それでもエラー メッセージが表示されるのはこのためです。

于 2012-09-10T00:04:58.900 に答える
0

igraph_get_shortest_paths(&g, &vecs, &evecs, 0, vs, IGRAPH_OUT)

1 つの頂点への複数の最短パスが返されないようです。1 つの頂点への/からの最短パスが複数ある場合に、より明確にするために、メソッドは 1 つのパスのみを返します(残りは無視します) !!!! ドキュメントに記載されているように、1 つの頂点への/からの複数のパスではありません。

于 2012-09-10T14:03:17.820 に答える