首页 > 解决方案 > 如何使用 R igraph 访问给定最短路径中的已访问顶点

问题描述

我使用all_shortest_paths函数来识别给定两个顶点的所有最短路径。

我不知道区别,但是以下两个函数给了我相同的结果

all_shortest_paths(g, 1,3)
get.all.shortest.paths(g, 1,3)

这是结果

$res
$res[[1]]
+ 3/9 vertices, from a86e634:
[1] 1 4 3

$res[[2]]
+ 3/9 vertices, from a86e634:
[1] 1 2 3


$nrgeo
[1] 1 1 2 1 1 0 1 1 1

现在,我想获取在没有源节点和汇节点的路径中访问的节点。例如,我得到了第一条最短路径。

> all_shortest_paths(g, 1,3)$res[1]
[[1]]
+ 3/9 vertices, from a86e634:
[1] 1 4 3`

如何存储不包括源节点和汇节点(即 1,3)的已访问节点?当我分配时a<- all_shortest_paths(g, 1,3)$res[1],它的类型看起来像列表,但无论我在做什么,我都无法访问 4。它一直返回我+ 3/9 vertices, from a86e634: [1] 1 4 3

标签: rigraph

解决方案


您需要在返回的列表中再往下一层all_shortest_paths。在下面的代码中,我创建了变量n以使其更具可读性。

library(igraph)

g <- make_graph("Cubical")

p <- all_shortest_paths(g, 1, 3)

n <- length(p[[1]][[1]])
p[[1]][[1]][-c(1, n)]
#+ 1/8 vertex, from 0de75ff:
#[1] 4

要一次性获取所有内部顶点,请使用lapplyon p[[1]]

lapply(p[[1]], function(.p){
  n <- length(.p)
  .p[-c(1, n)]
})
#[[1]]
#+ 1/8 vertex, from 0de75ff:
#[1] 4
#
#[[2]]
#+ 1/8 vertex, from 0de75ff:
#[1] 2

这段代码不依赖于内部顶点的数量,如果源和汇是 1 和 7 可以看出。
这次是单线。
(省略输出。)

p2 <- all_shortest_paths(g, 1, 7)

lapply(p2[[1]], function(.p) .p[-c(1, length(.p))])

推荐阅读