【问题标题】:Graph Algorithm To Find All Paths Between N Arbitrary Vertices查找 N 个任意顶点之间所有路径的图算法
【发布时间】:2011-02-12 23:39:02
【问题描述】:

我有一个具有以下属性的图表:

  • 无向
  • 未加权
  • 每个顶点至少有 2 条和最多 6 条连接到它的边。
  • 顶点数将
  • 图形是静态的,不能添加/删除或编辑任何顶点/边。

我正在寻找顶点的随机子集(至少 2 个)之间的路径。路径应该是只经过任何顶点一次的简单路径。

我的最终目标是拥有一组路线,以便您可以从一个子集顶点开始并到达任何其他子集顶点。跟随路线时不必经过所有子集节点。

我发现的所有算法(Dijkstra、深度优先搜索等)似乎都在处理两个顶点之间的路径和最短路径。

是否有已知算法可以提供连接这些顶点子集的所有路径(我想这些是子图)?

编辑:

我创建了一个(警告!程序员艺术)动画 gif 来说明我想要实现的目标:http://imgur.com/mGVlX.gif

有预处理和运行时两个阶段。

预处理

  1. 我有一个图和一个顶点子集(蓝色节点)
  2. 我生成连接所有蓝色节点的所有可能路线

运行时

  1. 我可以从任何一个蓝色节点开始,选择任何生成的路线,然后沿着它到达我的目标蓝色节点。

所以我的任务更多是创建连接所有蓝色节点的所有子图(路线),而不是创建从 A->B 的路径。

【问题讨论】:

  • 也许这对你有帮助:en.wikipedia.org/wiki/Steiner_tree_problem
  • 我没见过。但是,我无法在图中添加顶点,因为我正在使用该图来表示物理且无法修改的东西,因此我认为它不适用。
  • 我觉得描述有点难以理解。您能否提供一个小示例图和解决方案?
  • 您想要所有路径吗?您想要所有包含至少两个子集成员的简单路径
  • 我用动画 gif 更新了问题,并希望改进描述

标签: algorithm language-agnostic graph graph-theory subgraph


【解决方案1】:

有很多方法可以解决这个问题,为了不混淆,这里有一个单独的答案来解决你的核心问题的描述:

如果您一次只使用一个子图,那么查找所有可能的连接蓝色顶点的子图可能是多余的。我宁愿使用一种能找到单个但随机的算法(所以不是任何最短路径算法等,因为它总是相同的)。

如果您想保存这些子图之一,您只需保存用于随机数生成器的种子,您就可以再次生成相同的子图。

另外,如果你真的想找到一堆子图,随机算法仍然是一个不错的选择,因为你可以用不同的种子多次运行它。

唯一真正的缺点是你永远不会知道你是否找到了每一个可能的子图,但这听起来并不是你的应用程序的要求。

所以,关于算法:根据图表的属性,最佳算法可能会有所不同,但您总是可以从简单的随机游走开始,从一个蓝色节点开始,走到另一个蓝色节点(同时确保你没有走自己的旧脚步)。然后在该路径上选择一个随机节点并开始从那里走到下一个蓝色,依此类推。

对于某些图表,这具有非常糟糕的最坏情况复杂性,但可能足以满足您的情况。当然有更智能的方法可以找到随机路径,但我会从简单开始,看看它是否足够好。正如他们所说,过早的优化是邪恶的;)

【讨论】:

    【解决方案2】:

    一个简单的breadth-first search 将为您提供从一个源顶点到所有其他顶点的最短路径。因此,您可以从您感兴趣的子集中的每个顶点开始执行 BFS,以获取到所有其他顶点的距离。

    请注意,在某些地方,BFS 将被描述为给出一对顶点之间的路径,但这不是必需的:您可以继续运行它,直到它访问了图中的所有节点。

    此算法类似于Johnson's algorithm,但由于您的图表未加权,因此大大简化了。

    时间复杂度:由于每个顶点的边数是恒定的,所以每个 BFS 会花费 O(n),总的会花费 O(kn),其中 n 是顶点数k 是子集的大小。作为比较,Floyd-Warshall 算法将花费 O(n^3)。

    【讨论】:

      【解决方案3】:

      您要搜索的是(如果我理解正确的话)并不是所有路径,而是所有生成树。阅读有关生成树的维基百科文章here 以确定这些是否是您正在寻找的内容。如果是,那么您可能想阅读一篇论文:

      Gabow, Harold N.; Myers, Eugene W. (1978). "Finding All Spanning Trees of Directed and Undirected Graphs". SIAM J. Comput. 7 (280).

      【讨论】:

      • 这与我正在寻找的最接近,但是如果我理解正确,生成树将包含图形的所有顶点。我还查看了“K-最小生成树”,但这似乎是为了寻找包含一定数量顶点的生成树,而不是连接特定顶点集的树。
      • 你是对的,但是对算法进行专门化应该不会太难,这样它们就只考虑你感兴趣的顶点,而不是所有的顶点。即使这需要您修改算法,好处是您的问题应该比一般问题更容易。如果你愿意(如果我有时间的话),我可能会为了好玩而自己拍这张照片。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多