这个问题是我早先提出的类似问题的延续: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算法正确性的主要条件。有没有办法绕过这个问题?
感谢您提供任何帮助或提示。
答案 0 :(得分:1)
使用该集构建Subgraph
对象。子类DepthFirstIterator
,以便encounterVertex
将带有键v
的条目和值(无论e
的其他端点是什么)放入地图p
。从水槽搜索深度优先。通过初始化v
作为来源并查找v
,p[v]
,p[p[v]]
等来恢复路径,直到没有条目为止。这很痛苦,但图书馆的作者将FibonacciHeap
加入ClosestFirstIterator
,否则将成为您想要的班级。 (哎呀,如果你不关心另一个n log n时间操作,你可以在子图上运行Dijkstra。)
Kruskal的算法在断开连接的图形下运行良好。它返回最小权重跨越林,即,对于每个连接的组件,最小权重生成树。我不能保证这个特定的实现。