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。如果您不需要这些向量,请在此处提供一个空指针。通常,此参数或边都应该是非空的,但如果它们都是空指针,则不会给出错误或警告。

edges

结果,沿路径的边缘的 id。这是一个指针向量,每个元素都指向一个向量对象。这些应该在将它们传递给函数之前进行初始化,这将正确清除和/或调整它们的大小,并沿着从/到顶点的测地线填充顶点的 id。如果您不需要这些向量,请在此处提供一个空指针。通常,此参数或顶点都应该是非空的,但如果它们都是空指针,则不会给出错误或警告。

[...]

因此,沿路径的顶点返回 in vertices,沿路径的边返回 in edges

编辑

我看到你添加了一些源代码。正如文档所说,指针向量中的向量必须在调用此函数之前分配和初始化。这有点奇怪,因为它与其他 igraph 函数不同,但这仍然是您收到错误消息的原因。

于 2012-09-10T00:04:58.900 回答
0

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

似乎没有返回多个最短路径到一个顶点。更明确地说,在您有多个到/从一个顶点的最短路径的情况下,该方法仅返回一个路径(忽略其余路径)!!!!不是文档中提到的到/从一个顶点的多条路径。

于 2012-09-10T14:03:17.820 回答