transitive_closure#

transitive_closure(G, reflexive=False)[source]#

返回图的传递闭包

图 G = (V,E) 的传递闭包是一个图 G+ = (V,E+),其中对于 V 中的所有 v, w,当且仅当在 G 中存在从 v 到 w 的路径时,E+ 中存在边 (v, w)。

在此定义中,处理从 v 到 v 的路径有一些灵活性。自反传递闭包为长度为 0 的从 v 到 v 的路径创建一个自环。通常的传递闭包仅在存在环(长度 > 0 的从 v 到 v 的路径)时创建自环。我们也允许选择不创建自环。

参数:
GNetworkX 图

有向/无向图/多重图。

reflexive布尔值或 None,可选(默认为 False)

决定何时在传递闭包中创建自环。如果为 True,平凡环(长度 0)创建自环。结果是 G 的自反传递闭包。如果为 False(默认),非平凡环创建自环。如果为 None,不创建自环。

返回:
NetworkX 图

G 的传递闭包

抛出:
NetworkXError

如果 reflexive 不在 {None, True, False}

参考文献

示例

平凡环(即长度为 0 的环)的处理由 reflexive 参数控制。

reflexive=False(默认)时,平凡环(即长度为 0 的环)不创建自环。

>>> DG = nx.DiGraph([(1, 2), (2, 3)])
>>> TC = nx.transitive_closure(DG, reflexive=False)
>>> TC.edges()
OutEdgeView([(1, 2), (1, 3), (2, 3)])

然而,当 reflexive=False(默认)时,非平凡环(即长度大于 0 的环)创建自环。

>>> DG = nx.DiGraph([(1, 2), (2, 3), (3, 1)])
>>> TC = nx.transitive_closure(DG, reflexive=False)
>>> TC.edges()
OutEdgeView([(1, 2), (1, 3), (1, 1), (2, 3), (2, 1), (2, 2), (3, 1), (3, 2), (3, 3)])

reflexive=True 时,平凡环(长度 0)创建自环。

>>> DG = nx.DiGraph([(1, 2), (2, 3)])
>>> TC = nx.transitive_closure(DG, reflexive=True)
>>> TC.edges()
OutEdgeView([(1, 2), (1, 1), (1, 3), (2, 3), (2, 2), (3, 3)])

第三种选择是在 reflexive=None 时完全不创建自环。

>>> DG = nx.DiGraph([(1, 2), (2, 3), (3, 1)])
>>> TC = nx.transitive_closure(DG, reflexive=None)
>>> TC.edges()
OutEdgeView([(1, 2), (1, 3), (2, 3), (2, 1), (3, 1), (3, 2)])