在igraph中使用bfs查找生成树

时间:2013-08-01 09:26:44

标签: r igraph

我想使用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)

find spanning tree

结果是: tmp$order = 1 2 4 5 6 3tmp$father=0 1 4 1 1 2

我可以使用$father信息查找所有生成树吗?

4 个答案:

答案 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元素iorder的{​​{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)

enter image description here

如您所见,节点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”,该矩阵基于原始图的最小生成树