首先,我为我糟糕的绘图画表示道歉。权重显然没有缩放。我很难想出解决一些问题的算法。
首先,我想找到所有需要3"停止"或者更少从C到C(只是一个例子......可以是任何两个顶点)。经过研究,我发现BFS可能是我正在寻找的解决这个问题的方法。我在这个假设中是否正确?
有两条路径有3站或更少:
C - > D - > ç
C - > E - > B - > ç
我还想找到从A到C的最短路径(只是一个例子..可以是任意两个顶点)。经过一些研究后,我得出结论,我应该使用Dijkstra的算法。我在这个假设中是否正确?如果是这样,我看到有各种各样的实现。如果我使用二进制堆,fibonacci堆或队列吗?
谢谢,如果您需要更多信息,请告诉我们!
答案 0 :(得分:0)
首先,我想找到所有需要3"停止"从C到 C(只是一个例子......可以是任意两个顶点)。经过研究,我 发现BFS可能是我正在寻找的解决这个问题的方法。上午 我在这个假设中纠正了吗?
是的,你是。 BFS的属性是以级别顺序处理节点,因此您首先处理作为源节点的邻居的所有节点,然后处理作为源节点的邻居的邻居的节点等。
我也想找到从A到C的最短路径(只是一个例子.. 可以是任意两个顶点)。做了一点研究后,我来了 得出结论我应该使用Dijkstra的算法。我对么 在这个假设?如果是这样,我看到有各种各样的 实现。如果我使用二进制堆,fibonacci堆, 或队列?
再次,是的,Dijkstra的算法是解决此类问题的经典解决方案。还有其他算法更适合某些特殊情况(例如Bellman-Ford,如果你的图表中有负权重),但在大多数情况下(你的也是如此),请使用Dijkstra。关于实现,理论上最好的实现基于Fibonacci堆实现的最小优先级队列。此实现的运行时间为O(|E|+|V|/log|V|)
(其中|V|
是顶点数,|E|
是边数)。但是,在实践中,二进制堆通常优于斐波那契堆,有关详细信息,请参阅this interesting thread。