如何找到连接到顶点的'first'和'last'顶点

时间:2016-04-27 19:57:32

标签: r igraph

假设我有一个邻接矩阵如下:

library(igraph)
df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7))
g <- graph_from_data_frame(na.omit(df))

sample graph

对于每个顶点,如何在有向路径中显示第一个和最后一个顶点?例如,顶点'4'从6开始并以1结束。(或者,获取该路径中所有顶点的列表将起作用)。

2 个答案:

答案 0 :(得分:5)

考虑拓扑排序。对有向图进行拓扑排序将为您提供第一个和最后一个顶点。

对于R,您可以在igraph包中使用拓扑排序方法。 http://igraph.org/r/doc/topo_sort.html

答案 1 :(得分:0)

this answer之后,我最终对森林进行了图分解,然后找出哪个顶点的出度等于0,从而确定每个树的根节点(对于度数做同样的事情)产生哪些顶点是终点,虽然我意识到我不需要这些信息 - 因此我没有将此标记为答案。)

library(igraph)
library(dplyr)

df <- data.frame(id = 1:8, parent = c(NA, NA, 1, 1, 3, 4, NA, 7))
edgelist_df <- na.omit(df)
g <- graph_from_data_frame(edgelist_df)

tree_to_df <- function(graph, forest_edgelist){
  # for a directed tree, find its root and assign that root to every
  # node in the tree's edgelist

  # `dplyr::filter` fails on the subset below, so we use base R
  tree_dat <- forest_edgelist[forest_edgelist$id %in% V(graph)$name,]

  root <- which(degree(graph, v = V(graph), mode = 'out') == 0, useNames = T)
  tree_dat$root <- names(root)
  return(tree_dat)
}

root_dat <-
   decompose.graph %>% # find connected subgraphs
   lapply(tree_to_df, forest_edgelist = edgelist_df) %>%
   bind_rows