topological_sort#
- topological_sort(G)[source]#
返回一个按拓扑排序顺序生成节点的生成器。
拓扑排序是图中节点的一种非唯一排列,使得从节点 u 到节点 v 的有向边意味着 u 在拓扑排序顺序中出现在 v 之前。这种排序仅在图中没有有向环时有效。
- Parameters:
- GNetworkX 有向图
一个有向无环图 (DAG)
- Yields:
- 节点
按拓扑排序顺序生成节点。
- Raises:
- NetworkXError
拓扑排序仅定义在有向图中。如果图
G
是无向的,则引发NetworkXError
。- NetworkXUnfeasible
如果
G
不是有向无环图 (DAG),则不存在拓扑排序,并引发NetworkXUnfeasible
异常。如果在处理返回的迭代器时G
发生了变化,也可能引发此异常。- RuntimeError
如果在处理返回的迭代器时
G
发生了变化。
Notes
该算法基于 “Introduction to Algorithms: A Creative Approach” [1] 中的描述和证明。
References
[1]Manber, U. (1989). Introduction to Algorithms - A Creative Approach. Addison-Wesley.
Examples
要获取拓扑排序的反向顺序:
>>> DG = nx.DiGraph([(1, 2), (2, 3)]) >>> list(reversed(list(nx.topological_sort(DG)))) [3, 2, 1]
如果你的有向图自然地将边表示为任务/输入,节点表示发起任务的人/过程,那么 topological_sort 并不完全符合你的需求。你需要将任务转换为节点,并通过边反映依赖关系。结果是一种边的拓扑排序。这可以通过
networkx.line_graph()
实现:>>> list(nx.topological_sort(nx.line_graph(DG))) [(1, 2), (2, 3)]