igraph如何沿最短的路径获得边缘ID

时间:2012-09-09 21:22:28

标签: c shortest-path igraph edges

我有一个包含多个最短路径的图表,想要检索顶点的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:断言`v!=((void *)0)'失败

2 个答案:

答案 0 :(得分:1)

是的,应该这样做。来自the igraph homepage的文档:

[...]

vertices

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

edges

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

[...]

因此路径中的顶点将在vertices中返回,路径上的边缘将在edges中返回。

修改

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

答案 1 :(得分:0)

  

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

似乎没有返回到一个顶点的多个最短路径。为了更明确,如果你有一个以上最短的路径往返于一个顶点,该方法只返回一个路径(忽略其余的)!如文档中所述,不是指向/来自一个顶点的多条路径。