假设我有一个邻接矩阵如下:
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))
对于每个顶点,如何在有向路径中显示第一个和最后一个顶点?例如,顶点'4'从6开始并以1结束。(或者,获取该路径中所有顶点的列表将起作用)。
答案 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