Graph 有向无环图遍历。。。帮忙?

Graph 有向无环图遍历。。。帮忙?,graph,traversal,directed-acyclic-graphs,Graph,Traversal,Directed Acyclic Graphs,这有点出乎我的意料,我需要给朋友打电话。我需要遍历一个有向无环图,这是我第一次跌跌撞撞地学习图论。最近我读了很多关于它的书,但不幸的是,我没有时间在学术上搞清楚这一点。有人能帮我踢一脚,告诉我如何处理这棵树吗 规则如下: 有n个根节点(我称它们为“源”) 有n个端点节点 源节点携带一个数值 下游节点(我称之为“worker”节点)对传入值执行各种操作,如Add、Mult等 从下图可以看出,节点a、b和c需要在d、e或f之前进行处理 在这棵树上行走的正确顺序是什么? 您需要通过一个。排序不一定

这有点出乎我的意料,我需要给朋友打电话。我需要遍历一个有向无环图,这是我第一次跌跌撞撞地学习图论。最近我读了很多关于它的书,但不幸的是,我没有时间在学术上搞清楚这一点。有人能帮我踢一脚,告诉我如何处理这棵树吗

规则如下:

  • 有n个根节点(我称它们为“源”)
  • 有n个端点节点
  • 源节点携带一个数值
  • 下游节点(我称之为“worker”节点)对传入值执行各种操作,如Add、Mult等
从下图可以看出,节点
a
b
c
需要在
d
e
f
之前进行处理

在这棵树上行走的正确顺序是什么?


您需要通过一个。排序不一定是唯一的,因此可能有多个可用的顺序(这并不重要)


链接的wikipedia页面应该有具体的算法来帮助您。

我将研究DAG的线性化,这应该可以通过拓扑排序实现

根据我的记忆,线性化基本上是按照不变量的顺序排序的,对于所有节点(Node_X),这些节点与任何其他给定节点都有一个超出度
NodeA
NodeX
出现在
NodeA
之前

这意味着,根据您的示例,将首先处理节点a、b和d。节点c秒。最后是节点e和f


我当前正在为图中的每个条目存储一个节点及其下游邻居()。我开始觉得我需要放弃这个,把边缘分开存放。您是否有一个存储格式建议,可以使这些依赖项比较更容易?@vfxcode-如果每个节点都有一个上游父节点列表,这可能会有所帮助。实际上,如missingno所建议的,给定节点的父节点列表将有助于检查正在迭代的节点是否有任何进一步的传入边。如果没有,你可以将其插入列表S。我指的是维基百科页面中概述的拓扑排序算法。我想我最不清楚的(对不起)是遍历的方向。因为我在检查已知的输入,所以我是向上游走,随机检查节点,还是向下游走?不太确定您的意思,但在算法中,您从源节点列表开始(“顶部”)。然后,当您在S上枚举时。当枚举S的给定元素S时,删除所有边(S,v),其中v是S的“子元素”。如果v不再具有传入的边(您在这里检查的是v以上的一个级别),则将v添加到S。感谢您的回答,Nadir'S只是稍微复杂了一点。:)