【发布时间】:2021-12-16 00:59:03
【问题描述】:
我有一个玩具图g,然后我找到了the number of spanning trees by cofactor of the Laplacian。数字是 11。
library(igraph)
set.seed(2)
n <- 5 # n=5
m <- 6 # m=6
g <- erdos.renyi.game(n, p.or.m=m, type="gnm" , directed=FALSE, loops=FALSE)
lap_mat <- laplacian_matrix(g)
print(paste("number of spanning trees by cofactor = ", det(lap_mat[-1,-1])))
# 11
我有n=5 顶点,我绘制了原始图:
par(mfrow=c(2, 3))
layout <- layout.fruchterman.reingold(g)
plot(g, main="Original graph", vertex.size = 40, layout = layout)
然后使用graph.bfs() function 创建了 5 个生成树:
for (i in 1:n) {
r <- graph.bfs(g, root=i, order=TRUE, father=TRUE)
h <- graph(rbind(r$order, r$father[r$order, na_ok = TRUE])[, -1], directed=FALSE)
plot(h, main=paste("Spanning tree for root=", i), vertex.size = 40, layout = layout)
}
我需要绘制所有生成树。例如,不创建根 = 5 的下一棵树:
问题。为小型随机图生成所有树的可能方法是什么?
【问题讨论】:
-
你从哪里得到 11 棵树?你从 1 循环到
n = 5所以最终有 5 棵树。您有 5 个顶点,拉普拉斯算子的维度为5 x 5,并且有 5 个根开始用于广度优先搜索。 -
@MauritsEvers,为了找到给定图中的生成树总数,我计算了拉普拉斯矩阵 'det(lap_mat[-1,-1) 中 (1,1) 元素的辅因子])'。这个数字相当于图中生成树的总数。
-
你遍历所有顶点
for (i in 1:n)。由于n=5(根据您的设计),您最终会得到 5 个图表。不知道你期望这会如何产生 11 个图表。也许这是一个 XY 问题? -
@Szabolcs 是的,现在问题更清楚了。最初,OP 的困惑在于如何计算所有生成树(ST)并不明显。关于生成 ST 的算法的评论是 Algorithms for generating all possible spanning trees of a simple undirected connected graph: an extensive review。许多方法使用 BFS 来生成 initial ST;然后可以从这个初始 ST 生成所有其他 ST。我建议看一下评论。在 R 中实现这些方法之一应该不会(太)困难。
-
我打开了一个功能请求:github.com/igraph/igraph/issues/1827@Nick 如果您可以评论您的动机,这将有助于确定问题的优先级。
标签: r algorithm graph-theory igraph spanning-tree