如何在有向无环图中找到一组给定节点之间的所有路径?

12
我有一个项目列表(如下图中的蓝色节点),由我的应用程序用户分类。这些类别本身可以进行分组和分类。
生成的结构可以表示为有向无环图(DAG),其中项目是图拓扑结构底部的汇点,而顶层类别是源头。请注意,尽管其中一些类别可能定义得很好,但很多都是用户定义的,可能非常混乱。
示例: example data (来源:theuprightape.net
在该结构上,我想执行以下操作:
- 找到特定节点下方的所有项目(欧洲所有项目) - 找到通过n个节点集合的所有路径(如果有)(例如,通过SMTP从example.com发送的所有项目) - 找到位于一组节点下方的所有节点(交集:goyish brown foods)
第一个似乎很简单:从节点开始,沿着所有可能的路径到底部并收集那里的项目。然而,是否有更快的方法?记住我已经通过的节点可能有助于避免不必要的重复,但是否有更多的优化?

我该如何处理第二个问题?似乎第一步是确定集合中每个节点的高度,以确定从哪个节点开始,并找到包括剩余集合的所有路径。但这是最好的(或者甚至是一个好的)方法吗?

维基百科列出的图遍历算法似乎都关注于查找特定节点或两个节点之间最短或最有效的路径。我认为这两个都不是我想要的,还是我没有看到它如何适用于我的问题?我应该在哪里阅读?


我有点惊讶这篇帖子已经有了1k的浏览量,但是还没有对回答进行投票。这是因为懒惰吗?还是观众缺乏投票权?或者是回答有什么问题? - Hanno Fietz
2个回答

2
尽管您的图是无环的,但您提到的操作让我想起了控制流图分析的类似方面。基于支配关系的算法集合非常丰富,可能适用于此情况。例如,您提到的第三个操作让我想起了计算支配前沿的算法;我认为,如果您暂时引入“入口”和“出口”节点,该算法将直接起作用。入口节点连接“给定的节点集”,而出口节点则连接汇点。

另请参阅Robert Tarjan的基本算法。


2
我认为对于这三个问题,实质上都是相同的操作。你总是在询问“查找所有类型为Z的节点X,它们位于节点Y下方”。你只需要一个通用的机制来“定位所有在某节点下方的节点”(解决Q3),然后可以过滤结果以“nodetype=sink”(解决Q1)。对于Q2,你有起点(你的节点集)和终点(起点下方的任何汇点),因此你的解集是从指定起始节点到汇点的所有路径。所以我建议你基本上拥有一棵树,并且基本的树遍历算法将是解决这些问题的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接