Algorithm 这是我能得到的最好的复杂性吗?

Algorithm 这是我能得到的最好的复杂性吗?,algorithm,graph,breadth-first-search,Algorithm,Graph,Breadth First Search,问题如下: 您有n个domino片段和每个domino片段上的两个数字(n个片段),还有一组额外的m个domino片段,但您最多只能使用这组片段中的一个片段来帮助您执行以下操作: 计算从给定起点S到终点D可以使用的最小domino块数。 这意味着开始部分应该有编号(S),结束部分应该有编号(D)。 输入: n和多米诺骨牌碎片的编号(n对)。 m和额外的多米诺骨牌碎片的编号(m对)。 起点S和终点D。 输出: domino块的最小数量 我正在考虑使用BFS解决这个问题,从S开始,通过不断地从图中删

问题如下: 您有n个domino片段和每个domino片段上的两个数字(n个片段),还有一组额外的m个domino片段,但您最多只能使用这组片段中的一个片段来帮助您执行以下操作: 计算从给定起点S到终点D可以使用的最小domino块数。 这意味着开始部分应该有编号(S),结束部分应该有编号(D)。 输入: n和多米诺骨牌碎片的编号(n对)。 m和额外的多米诺骨牌碎片的编号(m对)。 起点S和终点D。 输出: domino块的最小数量

我正在考虑使用BFS解决这个问题,从S开始,通过不断地从图中删除节点m(I)并添加节点m(I+1),找到到D的最小路径 但这样做的时间复杂度将是O(n*m)。 但不仅如此,还可能有多个起点,因此复杂性为O(| S |*n*m)。 能否以更好的方式解决这个问题?
老师说它可以在线性时间内解决,但我只是很困惑。

我最初没有注意到你的问题有多个来源,并写了一个较长的答案解释如何解决这个问题。不管怎样,让我把它贴在这里,因为它可能仍然有用。进一步滚动查看原始问题的解决方案

在线性时间内寻找从单个S到D的最短路径

让我们逐步建立这个想法。首先,让我们尝试解决这个问题的一个更简单的版本,我们只需要找出是否可以通过从额外的M多米诺骨牌集中最多使用一个多米诺骨牌,从一个s到一个D

我建议这样做:对N个多米诺骨牌进行一些预处理,这样,对于M个额外的多米诺骨牌中的每一个,都可以快速(以恒定的时间)回答是否存在从S到D的路径通过该多米诺骨牌。(当然,当我们根本不需要额外的多米诺骨牌时,我们需要记住edge的情况,但它很容易在线性时间内覆盖。)

什么样的信息可以让你回答这个问题?假设您看到的是一个两端有数字a和B的多米诺骨牌。如果你知道你可以从S到A,从B到D,你可以用这个多米诺骨牌从S到D,对吗?或者,如果有一条从S到B和从a到D的路径,它也会工作。如果两者都不是真的,那么这个多米诺骨牌就无法帮助您从S到D

这很好,但是如果我们从每一个可能的B运行BFS,我们将无法实现线性时间复杂度。但是,请注意,您可以反转第二个问题(检测从B到D的路径是否存在),并将其设置为“我可以从D到每个可能的B吗”?这是很容易回答一个单一的BFS

您能看到这种方法是如何适应于通过每个domino查找最短路径的长度的,而不仅仅是检测路径是否存在吗

在线性时间内寻找从多个S到D的最短路径


让我们把问题反过来,假设我们想找到从D到多个s的最短路径。你可以创建一个有向图,其中的节点数是多米诺骨牌上唯一数字的两倍。也就是说,对于每个数字,都有节点V和V',如果您在V中,这意味着您还没有使用额外的domino,但是如果您在V',则意味着您已经使用了一个。多米诺骨牌(A,B)的每个核心(即原始N个核心之一)对应于图中的4条边:(A->B)、(B->A)、(A'->B')、(B'->A')。每个额外的domino对应于两条边:(A->B'),(B->A')。请注意,一旦我们进入一个带有“”的节点,我们就永远无法离开它,因此我们最多只会以这种方式使用一个额外的domino。图中D中的一个BFS将回答这个问题。

语言不可知的算法问题和尝试的解决方案都在主题中,但我对问题陈述缺乏清晰性。你能提供一些具体输入和输出的例子并加以解释吗?参见: