【问题标题】:Finding shortest cycle in undirected graph that includes 2 specified vertices在包含 2 个指定顶点的无向图中查找最短循环
【发布时间】:2019-05-14 22:29:41
【问题描述】:

我得到了一个类似于无向图的哲学家数据集。哲学家存储在哈希映射中,其中键是哲学家的名字,值是他的邻居列表。

用户给出 2 个哲学家的名字作为输入,我需要找到包含这 2 个哲学家的最短周期(如果存在的话)。

起初我认为这个问题与旅行商问题非常相似,但是在那个问题中,我们也有旅行距离,每个顶点只能访问一次,这似乎不是这种情况。这个问题的解决方案似乎与图形相关,但我不太确定使用哪种算法,甚至不确定哪个问题类似于它。

我想到的一个解决方案是在给定的图表中找到所有循环,将结果减少到仅包含用户给出的哲学家的循环,并从这些循环中只挑选最短的循环,因为我会根据如何对循环进行评分他们做出的许多“跳跃”基本上是一个简单的计数器。问题在于,考虑到数据集有多大以及可能形成多少个循环(很多),我担心它可能不是最佳解决方案。

输出需要采用以下格式:{u1, u2, u3, u4, u5, u1} 其中 u 是创建我正在寻找的循环的每个哲学家的名字。如果不存在这样的循环,那么我只需要打印一条适当的消息。

【问题讨论】:

  • 假设你想要一个哲学家不相交的循环(没有重复)......我试图想象一个情况,在两者之间找到最短和接近最短的路径是不够的并将它们粘合在一起以形成循环。我无法想象一个。如果这确实足够,那么您可以使用 BFS 轻松找到最短路径。从图中删除它。然后再做一次 BFS 找出第二短的。
  • 您应该编辑问题的标题以反映您想要一个涉及两个特定顶点的循环这一事实。我打算将您定向到computing the girth of a graph,但您的需求更精确。
  • 好的,谢谢@Gene,是的,我会编辑标题谢谢安东尼!
  • @Gene:考虑一个图,其中有八个顶点标记为 A 到 H,边连接 A-B-C-D、B-E-F-D 和 A-G-H-C(总共九个边)。从 A 到 D 的最短路径是 A-B-C-D,但包含 A 和 D 的唯一循环是 A-B-E-F-D-C-H-G-A。
  • @FotisAronis:哦,对不起,我想我误解了你的评论。我很想看看你的完整答案。我有点怀疑您描述的方法实际上是否会在所有情况下给出正确的结果,但是如果没有具体的描述,我不能肯定地说。

标签: java algorithm graph hashmap shortest-path


【解决方案1】:

您可以使用 Suurballe 算法的变体。正如维基百科解释的那样(https://en.wikipedia.org/wiki/Suurballe's_algorithm):

Suurballe 算法是一种在非负加权有向图中找到两条不相交路径的算法,使得两条路径连接同一对顶点并具有最小总长度。 […] Suurballe 算法的主要思想是使用 Dijkstra 算法找到一条路径,修改图边的权重,然后再次运行 Dijkstra 算法。算法的输出是通过将这两条路径组合起来形成的,丢弃路径相反方向遍历的边,用剩余的边形成两条路径返回作为输出。

及以后:

上述版本的 Suurballe 算法可找到具有不相交边但可能共享顶点的路径。可以使用相同的算法找到顶点不相交的路径,通过将每个顶点替换为一对相邻顶点,一个具有原始顶点的所有传入邻接u-in,一个与所有传出的邻接u-out。修改后的图中两条边不相交的路径必然对应于原图中的两条顶点不相交的路径,反之亦然,因此将 Suurballe 算法应用于修改后的图会导致在原图中构建两条顶点不相交的路径。

因此,您需要翻译 |V| 的未加权无向图顶点和 |E| 2|V| 的加权有向图的未加权、无向边顶点和 2|E| + |V|加权的有向边;然后应用Suurballe的算法;然后将结果转换回原始图上的循环。

【讨论】:

  • 谢谢!这听起来比我预期的要复杂一些,但我一定会调查的! ^^
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多