构造一个将两个 DAG 作为输入并返回在两者中找到的最长路径的算法

Posted

技术标签:

【中文标题】构造一个将两个 DAG 作为输入并返回在两者中找到的最长路径的算法【英文标题】:Constructing an Algorithm which takes as Input Two DAG's and Returns the Longest Path found in Both 【发布时间】:2022-01-17 16:17:55 【问题描述】:

构造并描述一个有效的算法,该算法将两个有向无环图 (DAG) 作为输入,并找到出现在这两个图中的最长路径。

如果有多个,算法应该返回最长的路径之一(不管是哪一个)。总之,给定图 G = (V,E) 和 G' =(V',E'),找到最长的可能序列 其中 (v_i,v_i+1)在 E E'中 i = 1...k-1。

有什么想法吗?我可以自己编写实际代码,我只需要帮助构建实际算法背后的想法并找到问题的解决方案。

我想我可以使用递归 DFS 和一些记忆:同时跟踪访问过的节点;对于每个起始节点和每个邻居,计算到邻居的距离 + 从邻居到目标的距离。然后取其中的最大值,将其作为该节点的最大值进行记忆,并返回。

对两个 DAG 都使用这种方法,这里的问题是确定这两个路径中哪一个是最长的。

将不胜感激任何想法/帮助。

【问题讨论】:

添加一个输入输出示例怎么样? @ShridharRKulkarni 我没有得到任何东西。这是我的算法和数据结构课程中的一个练习题。 但是为了让堆栈溢出社区准确理解您的问题和预期的解决方案,需要一个示例。例如,我不明白“两者中找到的最长路径”是什么意思。两个 DAG 中路径中的值是否应该相同?或者只是根据某些标准长度需要相同? + 这是一个练习题。因此,我们对您采取了哪些努力以及您在哪里陷入困境感兴趣。我们就是这样学习的。 两张图是一个红鲱鱼。丢弃不属于两个图的边,并使用一个图。现在您需要在一张图中找到最长的路径,这是众所周知的简单问题(对于 DAG)。 @ShridharRKulkarni 感谢您的反馈,我现在添加了更多描述,希望能更清楚。我确实有一个部分有一些关于如何解决问题的自己的想法。 【参考方案1】:

两种方法:

    从每个顶点开始,找出最长的公共路径是什么。 DFS+记忆。返回最大长度。如果您也想要路径,请记住最长的路径。

    找到 DAG 的交点并返回最长的相交路径。您可以找到here 图形交集的代码。同样,你也可以为 DAG 做。

在方法 1 中,您不需要存储 DAG 的相交部分,只需最大长度即可。因此,与方法二相比,它的内存效率更高。

在第一种方法中,您找出最大匹配路径的长度(此处为 BCD)并返回长度。

在第二种方法中,您将存储匹配的部分(此处为 BCD)并从中返回最长的路径长度。

方法3:

@"n. 1.8e9-where's-my-share m."在 cmets 中提到了另一种方法,您可以从一个图中删除另一个图中不存在的边。

因此,如果您从图 1 中删除图 2 中不存在的边,您将得到以下结果:

在上图中,如果你做 DFS,你会得到 3 作为答案,因为 BCD 是最长的路径。

【讨论】:

以上是关于构造一个将两个 DAG 作为输入并返回在两者中找到的最长路径的算法的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #656 (Div. 3)E. Directing Edges(拓扑排序+构造dag图)

如何通过引用返回一个向量,隐含地期望一个空向量作为输入?

Airflow DAG - 如何首先检查BQ(必要时删除)然后运行数据流作业?

如何构造并返回两个值,其中一个引用另一个[重复的]。

输入输出

如何构造一个将文件名作为输入的函数? [关闭]