拓扑排序#
- topological_sort(G)[source]#
返回按拓扑排序的节点生成器。
拓扑排序是有向图节点的一种非唯一排列,使得从 u 到 v 的边意味着 u 在拓扑排序顺序中出现在 v 之前。此排序仅在图没有有向环时有效。
- 参数:
- GNetworkX 有向图
有向无环图 (DAG)
- 产生:
- 节点
按拓扑排序产生节点。
- 引发:
- NetworkXError
拓扑排序仅定义用于有向图。如果图
G
是无向的,则会引发NetworkXError
。- NetworkXUnfeasible
如果
G
不是有向无环图 (DAG),则不存在拓扑排序,并会引发NetworkXUnfeasible
异常。如果在处理返回的迭代器期间G
发生更改,也可能引发此异常。- RuntimeError
如果在处理返回的迭代器期间
G
发生更改。
说明
此算法基于“算法导论:一种创造性方法” [1] 中的描述和证明。
参考文献
[1]Manber, U. (1989). Introduction to Algorithms - A Creative Approach. Addison-Wesley.
示例
获取拓扑排序的逆序
>>> 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)]