【问题标题】:igraph how to get edge ids along the shortest pathsigraph如何沿最短路径获取边缘ID
【发布时间】:2012-09-09 21:22:27
【问题描述】:

我有一个包含多个最短路径的图,并且想要检索顶点的 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

【问题讨论】:

  • c++标签改成c,igraph是一个c库。

标签: c shortest-path igraph edges


【解决方案1】:

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

[...]

vertices:

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

edges:

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

[...]

所以沿路径的顶点在vertices 中返回,沿路径的边在edges 中返回。

编辑

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

【讨论】:

  • 从代码中可以看出,有 3 条最短路径通过相同的 3 个顶点。我想得到代表这些路径的不同边集。但我得到 'igraph_vector_clear: Assertion "v != ((void *)0)" failed'
  • 这不是我应该如何初始化/分配 ptr 向量:igraph_vector_ptr_t verts; igraph_vector_ptr_init(&verts, 2); igraph_vector_ptr_t eds; igraph_vector_ptr_init(&eds, 2);
  • VECTOR(vecs)[i] = calloc(1, sizeof(igraph_vector_t)); ?
  • 不仅如此,在igraph_vector_ptr_t 中你必须有指向igraph_vector_t 对象的指针,并且这些也应该被初始化。见the example that comes with igraph
  • 示例程序无法编译:igraph_vector_init(VECTOR(vecs)[i], 0);无效参数
【解决方案2】:

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

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

【讨论】:

  • 好吧,文档说:“如果两个顶点之间有多个测地线,则此函数只给出其中一个。” (igraph.sourceforge.net/doc/html/…) 所以这实际上是有记录的。事实上,这就是它所说的一切,除了讨论论点是什么。
  • 查看get_all_shortest_paths() 函数以获取所有最短路径。 (igraph.sourceforge.net/doc/html/…)
  • get_all_shortest_paths() 仅检索节点 ID 列表,我还需要获取边的 ID。在某些情况下,我有多个连接两个顶点的边。有没有办法通过检索节点 ID 和边 ID 来获取从一个节点到另一个节点的所有最短路径。
  • 一种方法是获取顶点的 id,然后单独查询它们之间的边。可能最好使用igraph_get_eids_multi()
  • 所以可以说我有 7 条路径通过相同的 3 个顶点。我想识别构成各自路径的边缘的 ID。我怎样才能做到这一点 ?为了让igraph_get_eids_multi() 工作,我需要知道连接两个顶点的边的 nb,这样我才能知道我应该在 &pairs 参数中包含多少次。我真的不知道我该怎么做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多