我有一个包含以下属性的图表:
我正在寻找顶点的随机子集(至少2)之间的路径。路径应该是只能通过任何顶点一次的简单路径。
我的最终目标是拥有一组路线,以便您可以从其中一个子集顶点开始并到达任何其他子集顶点。在跟踪路由时,没有必要通过所有子集节点。
我发现的所有算法(Dijkstra,Depth first search等)似乎都在处理两个顶点和最短路径之间的路径。
是否有一个已知算法可以为我提供连接这些顶点子集的所有路径(我想这些是子图)?
编辑:
我创建了一个(警告!程序员艺术)动画gif来说明我想要实现的目标:http://imgur.com/mGVlX.gif
预处理和运行时分为两个阶段。
所以我的任务更多的是创建连接所有蓝色节点的所有子图(路线),而不是从A-> B创建路径。
答案 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的维基百科文章,以确定这些是否是您正在寻找的。如果是的话,你可能会想要阅读一篇论文:
答案 2 :(得分:1)
有很多方法可以解决这个问题,为了不混淆事情,这里有一个单独的答案,它解决了你的核心问题的描述:
如果你只是一次只使用一个,那么查找连接你的蓝色顶点的所有可能的子图可能有点过分。我宁愿使用一个算法,找到一个,但随机(所以不是任何最短路径算法等,因为它将始终是相同的)。
如果要保存其中一个子图,只需保存用于随机数生成器的种子,就可以再次生成相同的子图。
另外,如果你真的想找到一堆子图,那么随机算法仍然是一个不错的选择,因为你可以用不同的种子运行它几次。
唯一真正的缺点是你永远不会知道你是否找到了每一个可能的子图,但这听起来并不像你的应用程序那样。
因此,对于算法:根据图形的属性,最佳算法可能会有所不同,但您总是可以从一个简单的随机游走开始,从一个蓝色节点开始,再到另一个蓝色节点(同时确保你没有走在你自己的旧脚步)。然后在该路径上选择一个随机节点,然后从那里开始走到下一个蓝色,依此类推。
对于某些图表,这具有非常糟糕的最坏情况复杂性,但可能足以满足您的需求。当然有更智能的方法来查找随机路径,但我会从容易开始,看看它是否足够好。正如他们所说,过早优化是邪恶的;)