biconnected_components#
- biconnected_components(G)[source]#
返回一个节点集合的生成器,每个集合对应图的一个双连通分量
双连通分量是极大子图,移除其中的任何一个节点(及与该节点相关联的所有边)都不会使子图断开。请注意,节点可能属于多个双连通分量。这些节点称为关节点或割点。移除关节点会增加图的连通分量数量。
注意,按照惯例,一个二节点图(dyad)被视为一个双连通分量。
- 参数:
- GNetworkX 图
一个无向图。
- 返回:
- nodes生成器
节点集合的生成器,每个集合对应一个双连通分量。
- 抛出:
- NetworkXNotImplemented
如果输入的图不是无向图。
另请参见
is_biconnected
articulation_points
biconnected_component_edges
k_components
此函数是 k=2 的特殊情况
bridge_components
与此函数类似,但使用 2-边连通性而不是 2-节点连通性来定义。
注意
查找关节点和双连通分量的算法采用非递归深度优先搜索 (DFS) 实现,该算法跟踪回边在 DFS 树中到达的最高层。节点
n
是关节点当且仅当存在以n
为根的子树,并且n
的任何后继节点都没有回边连接到 DFS 树中n
的前驱节点。通过跟踪 DFS 遍历的所有边,我们可以获得双连通分量,因为一个双连通分量的所有边都将在关节点之间连续遍历。参考文献
[1]Hopcroft, J.; Tarjan, R. (1973). “Efficient algorithms for graph manipulation”. Communications of the ACM 16: 372–378. doi:10.1145/362248.362272
示例
>>> G = nx.lollipop_graph(5, 1) >>> print(nx.is_biconnected(G)) False >>> bicomponents = list(nx.biconnected_components(G)) >>> len(bicomponents) 2 >>> G.add_edge(0, 5) >>> print(nx.is_biconnected(G)) True >>> bicomponents = list(nx.biconnected_components(G)) >>> len(bicomponents) 1
你可以使用 sort 生成双连通分量的排序列表,最大的排在前面。
>>> G.remove_edge(0, 5) >>> [len(c) for c in sorted(nx.biconnected_components(G), key=len, reverse=True)] [5, 2]
如果你只需要最大的连通分量,使用 max 比使用 sort 更高效。
>>> Gc = max(nx.biconnected_components(G), key=len)
要将分量创建为子图,请使用:
(G.subgraph(c).copy() for c in biconnected_components(G))