如何使用igraph获取最小生成树(MST)的基本环与基本割集
igraph获取MST对应基本环与基本割集的方法
以下基于R语言的igraph包给出实现方法,可直接匹配你提供的示例场景:
1 非MST边对应的基本环
igraph内置了fundamental_cycles()函数可直接返回所有非树边对应的基本环,无需手动实现逻辑,示例代码如下:
# 你的初始构造代码 A = matrix(c( 0, 8, 0, 5, 0, 10, 8, 0, 3, 6, 9, 10, 0, 3, 0, 3, 9, 0, 5, 6, 3, 0, 0, 0, 0, 9, 9, 0, 0, 0, 10, 10, 0, 0, 0, 0), nrow= 6 , ncol= 6 ,byrow = TRUE) g <- graph.adjacency(A,weighted=TRUE, mode = c("undirected")) # 计算MST mst_g <- mst(g, weights = E(g)$weight) # 获取所有基本环,每个环对应一条非MST边 fc <- fundamental_cycles(g, mst_g)
返回结果中:
fc$non.tree.edges列出所有非树边,和结果中的环一一对应fc$cycles列出每个基本环的顶点序列fc$edges列出每个基本环包含的边
你提到的非树边1-6对应的环,可直接通过上述结果匹配得到,和你示例的环完全一致。
2 MST边对应的基本割集
基本割集的逻辑是:移除某条树边后MST会拆分为两个连通分量,原图中所有跨这两个分量的边就是该树边对应的基本割集,实现代码如下:
# 以你示例的MST边1-4为例 # 找到MST中1-4对应的边id target_tree_edge <- E(mst_g)[V(g)[1] %--% V(g)[4]] # 移除该边,得到拆分后的MST split_mst <- delete_edges(mst_g, target_tree_edge) # 获取拆分后的两个连通分量 comp <- groups(components(split_mst)) # 提取原图中跨两个分量的所有边,即为对应的基本割集 cut_set <- E(g)[comp[[1]] %--% comp[[2]]]
打印cut_set即可得到你示例中的(1-4), (1-2), (1-6)三条边。如果需要批量获取所有树边的基本割集,遍历所有MST边重复上述逻辑即可。
内容的提问来源于stack exchange,提问作者whitepanda
相关产品推荐
相关产品推荐

