最广泛的路径挑战 - 在最大生成树中查找路径的最有效方法

时间:2013-09-04 19:59:57

标签: algorithm optimization data-structures graph-theory graph-traversal

这个问题是我早先提出的类似问题的延续:Find path between two nodes in graph, according to given criteria - optimization task

问题摘要: 我需要找到从顶点A到顶点B的图形中的最佳路径,假设路径质量计算为路径上边缘权重的最小值,接下来最佳路径是具有最大最小值的路径。通常它被称为"Widest path problem"

以前我需要在非常小的图形(最多15个顶点)中解决这个问题,所以我不需要复杂的算法,并且在善良的人的帮助下,我设计了我的工作算法。 不幸的是现在我需要以这种方式重新定义我的必需品,我的图表可能非常大(甚至50万个边缘)。 我知道我需要为我的图找到最大生成树,并获得从获得的MST中的开始到停止顶点的简单路径。 我决定使用jGraphT库。它已实施Kruskal Minimum Spanning Tree algorithm。我可以通过将每个边权重乘以(-1)并使用Kruskal乘以最小生成树来获得最大生成树,但是库中的算法被设计用于检索MST边的哈希集。

我的问题如下: 我已经获得了图的最大生成树作为边的java HashSet。如何以最有效的方式在这种结构中找到从顶点A到顶点B的路径,以及为此目的哪种数据结构最有效?你推荐我什么?

另外,我担心这种情况,我的图形并不总是一致的(它可能包含孤立的顶点或孤立的子图),这是Kruskal算法正确性的主要条件。有没有办法绕过这个问题?

感谢您提供任何帮助或提示。

1 个答案:

答案 0 :(得分:1)

使用该集构建Subgraph对象。子类DepthFirstIterator,以便encounterVertex将带有键v的条目和值(无论e的其他端点是什么)放入地图p。从水槽搜索深度优先。通过初始化v作为来源并查找vp[v]p[p[v]]等来恢复路径,直到没有条目为止。这很痛苦,但图书馆的作者将FibonacciHeap加入ClosestFirstIterator,否则将成为您想要的班级。 (哎呀,如果你不关心另一个n log n时间操作,你可以在子图上运行Dijkstra。)

Kruskal的算法在断开连接的图形下运行良好。它返回最小权重跨越,即,对于每个连接的组件,最小权重生成树。我不能保证这个特定的实现。