【问题标题】:Algorithm for BFS traveral of an acylic directed graph无环有向图的BFS遍历算法
【发布时间】:2009-07-21 06:03:17
【问题描述】:

我正在寻找一个优雅的 Python 程序,它对 DAG 进行 BFS 遍历:

如果 A“依赖于”B,则节点 A 连接到 B (A->B)(想想 python 包 Foo “依赖于”Bar: Foo->Bar)。

在大约 7000 个这样的节点的图中,我想对所有节点进行排序,以便对于所有可能的 (i, j) 其中 1>=i<j<=7000 .. depends(Ni, Nj) 为 False。 depends(A, B) = True 当且仅当 A->B 或 A“依赖于”B .. 并且 Nx 是出现在排序列表中 xth 位置的节点。

注意:一个节点可以有多个父节点。例如:A->C 和 B->C。因此,根据上述排序规则,A和B必须在C之前。

【问题讨论】:

  • 介意清理最后一段吗?
  • @LFSR - 我曾尝试考虑我知道的 BFS 树遍历,但它不适用于图/森林......其中一个节点可以有多个父节点。
  • 我相信他想要拓扑排序。
  • @niteria - 哇,就是这样......我怎么会忘记拓扑排序(尽管在学校学习算法并参加了 ACM ICPC 区域赛)。猜猜,我老了..
  • @pianoman:我编辑了一下。这对你来说清楚了吗?

标签: python algorithm graph dependencies traversal


【解决方案1】:

如果我没有正确阅读问题,您似乎需要topological sort。最有效的算法(O(V+E))由Tarjan提出,可以在here找到Python实现。

题外话,但似乎你的包依赖类比是颠倒的;我认为“A取决于B”意味着“B->A”,但这当然不会改变树的结构,只是颠倒它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多