求N个任意顶点之间所有路径的图算法

时间:2010-04-27 17:22:29

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

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

  • 无向
  • 未加权
  • 每个顶点至少有2个,最多连接6个边。
  • 顶点数将是< 100
  • 图表是静态的,无法添加/删除或编辑顶点/边。

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

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

我发现的所有算法(Dijkstra,Depth first search等)似乎都在处理两个顶点和最短路径之间的路径。

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

编辑:

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

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

预处理

  1. 我有一个图形和一个顶点子集(蓝色节点)
  2. 我生成连接所有蓝色节点的所有可能路由
  3. 运行时

    1. 我可以从任何蓝色节点开始选择任何生成的路线并沿着它行进以到达我的目的地蓝色节点。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

如果要保存其中一个子图,只需保存用于随机数生成器的种子,就可以再次生成相同的子图。

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

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

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

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