首先,我不会说谎。这是我的作业。我已经花了太多的时间来解决这个问题,但是我一点头绪都没有。
我需要编写一个高效的算法,从给定的顶点到所有其他顶点找到具有偶数长度路径的所有顶点。
我知道这可能与使用DFS有关......
请给我一些指导!
首先,我不会说谎。这是我的作业。我已经花了太多的时间来解决这个问题,但是我一点头绪都没有。
我需要编写一个高效的算法,从给定的顶点到所有其他顶点找到具有偶数长度路径的所有顶点。
我知道这可能与使用DFS有关......
请给我一些指导!
由于这是一份作业,我只提供一些提示:
visited
集合,则所有“发现”的顶点都具有从源到当前深度的路径。2|V|
,则所有源自偶数长度路径的顶点将在某个偶数深度级别中被发现。【说服自己为什么:对于奇数长度循环会发生什么?对于偶数长度循环会发生什么?】注意:运行时间与顶点数呈指数关系[加倍]。
2|V|
,其中|V|
是图中顶点的数量。 - amitG
,并使用DFS,因为它 - 在不改变它的情况下 - 使得分析和证明正确性更容易。 - amit你是否关注运行时间?这个问题已经讨论过了吗?你有没有谈到集合的有效数据结构?如果没有,那么阿米特的提示应该会帮到你。
如果是的话,那么你可能需要更聪明一些。你在讨论DFS时提到过维护先前访问过的顶点的集合,是吗?
你可以代替维护一个集合,而维护多个含义略有不同的集合。你可能想象你的访问集合是这些不同集合的并集,但至关重要的是,如果一个顶点首先出现在一个集合中,然后在之后又出现在另一个集合中,你可能需要重新访问它。
问问自己:我应该将哪些顶点放入集合中?如果一个顶点已经通过被访问而加入了某个集合,什么情况下可能需要重新访问它?要小心,你很容易犯错。
U
,其中U
包含于V
,以便对于U
中的每个节点u
,都存在一条路径/最短路径【长度相同】?并且路径需要延伸到哪里?是所有在U
或者在V
中的顶点吗? - amit