【问题标题】:The Widest Path Challenge - the most efficient way for finding path in Maximal Spanning Tree最宽路径挑战 - 在最大生成树中寻找路径的最有效方法
【发布时间】:2013-09-04 19:59:56
【问题描述】:

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

问题总结: 我需要在图中找到从顶点 A 到顶点 B 的最佳路径,假设路径质量被计算为路径上边缘权重的最小值,而下一个最佳路径是具有最大最小值的路径。一般就是所谓的"Widest path problem"

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    Kruskal 的算法可以很好地处理断开连接的图。它返回一个最小权重生成森林,即,对于每个连接的组件,一个最小权重生成树。我不能保证这个特定的实现。

    【讨论】:

    • 感谢您的回复。我考虑过使用 DepthFirstIterator 类,但由于无法提供开始和停止顶点,我发现它在我的情况下没用。我不完全理解你的解决方案。尤其是我如何获得相邻顶点的 p 图?遇到Vertex() 方法是受保护的。公共接口确保只能访问 Next() 方法,该方法检索新的、已访问的顶点。你能附上一段代码吗?谢谢。
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多