具有非负权重的有向图(邻接矩阵)

Directed graph with non negative weights (adjacency matrix)

首先,我为我绘制的图表不当而道歉。权重显然没有缩放。我很难想出解决一些问题的算法。

首先,我想找到所有从 C 到 C 需要 3 "stops" 或更少的路径(只是一个例子......可以是任何两个顶点)。经过研究,我发现 BFS 可能是我正在寻找的解决这个问题的方法。我的这个假设是否正确?

有两条路径不超过 3 个站点:

C -> D -> C

C -> E -> B -> C

我也想找到从A到C的最短路径(只是一个例子..可以是任意两个顶点)。在做了一些研究之后,我得出的结论是我应该使用 Dijkstra 算法。我的这个假设是否正确?如果是这样,我看到有多种实现方式。我使用二叉堆、斐波那契堆还是队列有关系吗?

谢谢,如果您需要更多信息,请告诉我!

First, I want to find all paths that take 3 "stops" or less from C to C (just an example... can be any two vertexes). After researching, I found that BFS might be what I'm looking for to solve this problem. Am I correct in this assumption?

是的,你是。 BFS的属性是按照level-order处理节点,因此首先处理所有与源节点相邻的节点,然后是与源节点相邻的节点等

I also want to find the shortest path from A to C (just an example.. can be any two vertexes). After doing a little bit of research, I came to the conclusion that I should use Dijkstra's algorithm. Am I correct in this assumption? If so, I saw that there are various implementations. Does it matter if I use binary heap, fibonacci heap, or queue?

同样,是的,Dijkstra 算法是此类问题的经典解决方案。还有其他算法更适合某些特殊情况(例如 Bellman-Ford,如果你的图中有负权重),但在大多数情况下(你的也是如此),请使用 Dijkstra。关于实现,理论上最好的实现是基于斐波那契堆实现的最小优先级队列。本次实现的运行次为O(|E|+|V|/log|V|)(其中|V|为顶点数,|E|为边数)。但是,在实践中,二叉堆通常优于斐波那契堆,请参阅 this interesting thread 了解更多信息。