我想使用igraph函数graph.bfs
在图形中找到生成树。
你能告诉我怎么样吗?
PS:我尝试使用$father
返回值的graph.bfs
信息,但结果让我感到困惑。这是一个例子:
g <- graph(c(1,2,2,6,1,4,4,6,5,6,1,5,5,3,3,4), directed=FALSE)
plot(g)
tmp <- graph.bfs(g, root=1, neimode='all', order=TRUE, father=TRUE,callback=f)
结果是:
tmp$order = 1 2 4 5 6 3
和tmp$father=0 1 4 1 1 2
我可以使用$father
信息查找所有生成树吗?
答案 0 :(得分:2)
father
向量由节点索引,即它与order
的顺序不同。
library(igraph)
g <- graph(c(1,2,2,6,1,4,4,6,5,6,1,5,5,3,3,4), directed=FALSE)
r <- graph.bfs(g, root=1, neimode='all', order=TRUE, father=TRUE)
h <- graph( rbind(r$order, r$father[r$order])[,-1], directed=FALSE )
plot(h)
在这个例子中,我们有:
order: 1 2 4 5 6 3
father: 0 1 4 1 1 2.
i
的{{1}}元素是预遍历顺序中order
个节点的名称(或索引)。
i
的{{1}}元素是索引i
的父节点的名称(或索引) - 不是father
元素的i
元素i
。 order
的{{1}}元素的父级是i
。这就是我们定义边缘所需要的。
因此,树的边缘是:
order
答案 1 :(得分:1)
为避免错误,例如: simple_vs_index(x,ii,na_ok)中的错误:选择了未知顶点 我们需要将其中一个代码语句更改为:
h <- graph( rbind(r$order, r$father[r$order, na_ok = TRUE])[,-1], directed=FALSE )
这允许NA存在于索引中。
答案 2 :(得分:0)
我认为order
很简单。对于father
,
> r$order
6/6 vertices, from 29ab0f7:
[1] 1 2 4 5 6 3
> r$father
+ 6/6 vertices, from 29ab0f7:
[1] NA 1 4 1 1 2
节点1(标签为1的节点)没有父亲 - >
节点2将节点1作为父亲
节点3将节点4作为父亲
节点4将节点1作为父亲
节点5将节点1作为父亲
节点6将节点2作为父*
在星号表示的情况下,这里很容易混淆。 “为什么节点6由节点2而不是节点4生成?”。答案是父节点没有被定义为节点6所连接的横向序列中的最新元素,而是节点6所连接的横向序列中最早的元素。即,节点6连接到节点2和节点4(节点2在横向序列中较早)。这是一个使这个概念显而易见的例子
g <- sample_smallworld(1, 5, 5, 0.05)
plot(g)
r <- graph.bfs(g, root=1, neimode='all', order=TRUE, father=TRUE)
如您所见,节点1为所有节点提供父亲,因为它是横向序列中最早的节点,并且它连接到所有节点。
$order
+ 5/5 vertices, from 0960d64:
[1] 1 2 3 4 5
$father
+ 5/5 vertices, from 0960d64:
[1] NA 1 1 1 1
答案 3 :(得分:0)
我同意上面“ Vincent Zoonekynd”给出的答案。但是,它对我不起作用。因此,我进行了一些修改以使其正常运行。这是我的代码
library(igraph)
g2 <- graph(c(1,2,2,6,1,4,4,6,5,6,1,5,5,3,3,4), directed=FALSE)
r <- graph.bfs(g2, root=1, neimode='all', order=TRUE, father=TRUE)
a = as.integer(r$order)
aa = as.integer(r$father)
h <- graph( rbind(a, aa[a])[,-1], directed=FALSE )
plot(h)
它给出一个新矩阵“ h”,该矩阵基于原始图的最小生成树