假设存在有向图,G(V, E)
(V表示顶点,E表示边),其中每条边(x,y)与权重(x,y)相关联,其中权重是一个整数1和10。
假设s
和t
是V
中的一些顶点。
我想在时间O(m + n)中计算从s
到t
的最短路径,其中m
是顶点数,n
是边数。
我是否会在实现拓扑排序方面走上正轨?还是有另一种我忽视的技术?
答案 0 :(得分:1)
在加权图中,您需要用于查找从给定顶点到另一个顶点的最小路径的算法是Dijkstra's algorithm。不幸的是,它的复杂性是O(n*log(n) + m)
,这可能比你试图完成的更多。
然而,在您的情况下,边缘是特殊的 - 它们的权重只有10个有效值。因此,您可以实现一种特殊的数据结构(堆的类型,但利用小的数据集)来使所有操作保持不变。
一种可行的方法是拥有10个列表 - 每个重量一个。在数据结构中添加边缘只是附加到列表中。找到最小元素是对10个列表进行迭代,以找到第一个非空的列表。这仍然是恒定的,因为将执行不超过10次迭代。删除最小元素也很简单 - 从列表中简单删除。
使用具有相同渐近复杂度的一些数据结构的Dijkstra算法将是您所需要的。