构造一个将两个 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图)