给出如下图:
g= graph.formula(A -+ B,
B -+ C,
A -+ C,
B -+ D,
C -+ D
)
plot(g)
总体目标是将图形拆分为所有简单子图。在我目前的方法中,我收集了从根"A"
到离开"D"
的所有简单路径。
paths= all_simple_paths(g, from = "A", to = "D")
然后我根据g
生成图paths
的所有子图。
sg= lapply(paths, function(x) induced_subgraph(g, x))
虽然paths[[1]]
包含路径"A" "B" "C" "D"
的顶点序列,但第一个子图sg[[1]]
并未完全遵循路径序列:
IGRAPH DN-- 4 5 --
+ attr: name (v/c)
+ edges (vertex names):
[1] A->B A->C B->C B->D C->D
问题:
sg[[1]]
包含2条边A->C, B->D
太多。我理解igraphs
induced_subgraph()
函数在选择提供的顶点时正常工作,而忽略了sequnce作为进一步的约束。
问题:
如何在完全遵循顶点序列的基础上将g
基于paths
分组到所有简单图形中?
注释:
get.all.shortest.paths()
无法实现将图表拆分为所有简单子图的首要目标,因为paths[[1]]
找不到"A" "B" "C" "D"
。
答案 0 :(得分:1)
试试这个
library(igraph)
set.seed(1)
g= graph.formula(A -+ B,
B -+ C,
A -+ C,
B -+ D,
C -+ D
)
coords <- layout.auto(g)
rownames(coords) <- V(g)$name
paths <- all_simple_paths(g, from = "A", to = "D")
sg <- lapply(paths, function(x) subgraph.edges(g, get.edge.ids(g, x[tail(head(rep(seq(x), each = 2), -1), -1)])))
par(mfrow = c(2, 2))
invisible(lapply(c(list(g), sg), function(x) plot(x, layout = coords[V(x)$name, ])))