Find spanning tree using bfs in igraph

a 夏天 提交于 2019-12-11 07:56:32

问题


I would like to find a spanning tree in a graph using igraph function graph.bfs. Could you show me how?

PS: I try to use the $father info of the returned value from graph.bfs, but the result confuses me. Here is an example:

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)

The result is : tmp$order = 1 2 4 5 6 3 and tmp$father=0 1 4 1 1 2

Can I use the $father info to find all the spanning tree?


回答1:


The father vector is indexed by the nodes, i.e., it is not in the same order as 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)

In this example, we have:

order:  1 2 4 5 6 3
father: 0 1 4 1 1 2.

The ith element of order is the name (or index) of ith node in the pre-traversal order.

The ith element of father is the name (or index) of the parent of the node with index i -- not of the ith element of order. The parent of the ith element of order is parent[order[i]]. This is what we need to define the edges.

The edges of the tree are therefore:

order:  1 2 4 5 6 3
        | | | | | |
father: 0 1 1 1 2 4.



回答2:


To avoid errors like: Error in simple_vs_index(x, ii, na_ok) : Unknown vertex selected we need to change one of code statements as:

h <- graph( rbind(r$order, r$father[r$order, na_ok = TRUE])[,-1], directed=FALSE )

This allows for NA to be present in indices.




回答3:


I assume order is straightforward. For 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
  • node 1 (node with label 1) does not have a father -->NA

  • node 2 has node 1 as a father

  • node 3 has node 4 as a father

  • node 4 has node 1 as a father

  • node 5 has node 1 as a father

  • node 6 has node 2 as a father*

There is easy confusion here in cases denoted by the asterisk. "Why is node 6 fathered by node 2 but not node 4?". The answer is that the father is not defined as the most recent element in the transversal sequence that node 6 is connected to, but the earliest element in the transversal sequence that node 6 is connected to. i.e. node 6 is connected to node 2 and node 4 (node 2 is earlier in the transversal sequence). Here is an example that makes this concept obvious

g <- sample_smallworld(1, 5, 5, 0.05)
plot(g)
r <- graph.bfs(g, root=1, neimode='all', order=TRUE, father=TRUE)

As you can see, node 1 fathers all the nodes because it is the earliest in the transversal sequence and it is connected to all the nodes.

$order
+ 5/5 vertices, from 0960d64:
[1] 1 2 3 4 5

$father
+ 5/5 vertices, from 0960d64:
[1] NA  1  1  1  1


来源:https://stackoverflow.com/questions/17990133/find-spanning-tree-using-bfs-in-igraph

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!