给定无向图(未加权)和两个顶点 u 和 v , 如何找到 u 和 v 之间的路径,其长度可被3整除?
请注意,路径不一定是简单的路径。
我考虑过DFS的变体和存储路径(以及回溯)的堆栈,但也不能完全理解如何跟踪非简单路径。
时间复杂度应为O(V + E),因此我预计它必须是BFS或DFS的变体。
答案 0 :(得分:6)
作弊方式:
从D到B的DFS / BFS;如果长度L%3 == 0,则完成; L%3 == 1,走到邻居然后回来;否则,走到邻居那里然后又回来。
如果这不符合您的限制,那么:
您可以使用修改后的BFS执行此操作。在进行搜索时,尝试标记您遇到的所有周期;你可以得到所有简单的周期和长度。
之后,如果从A到B的路径长度为L%3 == 0,那么就找到了它。
如果没有,那么在所有周期都有长度Lk%3 == 0的情况下,没有解决方案;
如果有一些长度为K%3!= 0的循环,你可以先从A循环到这个循环,循环一到两次然后再回到A再到B.你可以保证找到长度为3的路径这样。
答案 1 :(得分:5)
执行此操作的一种方法是计算图表的修改版本,并在该图表上执行BFS或DFS。
想象一下,将图形叠加在自身顶部三次。每个节点现在出现三次。将第一个副本注释为“mod 0”,将第二个副本注释为“mod 1”,将第三个副本注释为“mod 2”。然后,更改边缘,以便从节点u到节点v的任何边缘始终从节点u到图形的下一层中的节点v。因此,如果从u到v有一个边缘,那么现在有一个边缘从u mod 0到v mod 1,u mod 1到v mod 2,u mod 2到v mod 0.如果你做了BFS或DFS over这个图并找到从u mod 0到任何节点v mod 0的路径,你必须有一个长度必须是三的倍数的路径。
您可以通过复制图形两次并适当地重新布线来在时间O(m + n)中显式构造此图形,并且从那里BFS或DFS将花费时间O(m + n)。然而,这使用了记忆Θ(m + n)。
另一种解决方案是模拟执行此操作而不实际构建新图。做一个BFS,并为每个节点存储三个距离 - 一个mod 0距离,一个mod 1距离和一个mod 2距离。每当您从队列中将节点出列队列时,将其后续队列排队,但将其标记为位于下一个mod层(例如,如果您将级别为0的节点出列队列,将其后续队列置于mod 1,等等)。您可以单独跟踪是否你已经到达距离mod 0,mod 1和mod 2的节点,并且不应该多次将给定mod级别的节点入队。这也花费时间O(m + n),但没有明确地构造第二个图,因此只需要O(n)存储空间。
希望这有帮助!
答案 2 :(得分:0)
这是我的伪代码。它使用 BFS 和简单的计数器和模数测试。
注意:用堆栈替换队列也应该有效。那将是 DFS 。