当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python NetworkX dag_to_branching用法及代码示例


本文简要介绍 networkx.algorithms.dag.dag_to_branching 的用法。

用法:

dag_to_branching(G)

返回一个分支,表示给定有向无环图中从根节点到叶节点的所有(重叠)路径。

networkx.algorithms.tree.recognition 中所述,branching 是一个有向森林,其中每个节点最多有一个父节点。换句话说,分支是 arborescences 的不相交并集。对于此函数,G 中度数为零的每个节点都将成为其中一个树状结构的根,并且从该根到 G 中的叶节点的每条不同路径都有一个叶节点。

G 中的每个节点 vk 父节点在返回的分支中成为 k 不同的节点,每个父节点一个节点,并且每个副本都复制以 v 为根的 sub-DAG。然后该算法在 v 的每个副本的子代上递归。

参数

GNetworkX 图

有向无环图。

返回

DiGraph

G 中的root-to-leaf 路径(其中多个路径可能共享同一个叶子)和分支中的root-to-leaf 路径之间存在双射的分支(其中从根到叶子的路径是唯一的) )。

每个节点都有一个属性‘source’,其值为该节点对应的原始节点。没有其他图形、节点或边属性被复制到这个新图形中。

抛出

NetworkXNotImplemented

如果 G 不是定向的,或者如果 G 是多图。

HasACycle

如果G 不是非循环的。

注意

这个函数不是幂等的,因为每次调用该函数时,返回的分支中的节点标签可能是唯一生成的。事实上,节点标签可能不是整数;为了将节点重新标记为更具可读性,您可以使用 networkx.convert_node_labels_to_integers() 函数。

此函数的当前实现使用 networkx.prefix_tree() ,因此受该函数的限制。

例子

为了检查返回分支中的哪些节点是由有向无环图中的哪个原始节点产生的,我们可以将源节点到新节点的映射收集到字典中。例如,考虑有向菱形图:

>>> from collections import defaultdict
>>> from operator import itemgetter
>>>
>>> G = nx.DiGraph(nx.utils.pairwise("abd"))
>>> G.add_edges_from(nx.utils.pairwise("acd"))
>>> B = nx.dag_to_branching(G)
>>>
>>> sources = defaultdict(set)
>>> for v, source in B.nodes(data="source"):
...     sources[source].add(v)
>>> len(sources["a"])
1
>>> len(sources["d"])
2

要将节点属性从原始图复制到新图,您可以使用上面示例中构造的字典:

>>> for source, nodes in sources.items():
...     for v in nodes:
...         B.nodes[v].update(G.nodes[source])

相关用法


注:本文由纯净天空筛选整理自networkx.org大神的英文原创作品 networkx.algorithms.dag.dag_to_branching。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。